powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / c# wpf returnig page
13 сообщений из 13, страница 1 из 1
c# wpf returnig page
    #39064299
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Пытаюсь реализовать returnig страницы, для того чтобы можно было определить завершения редактирования на странице.
Использую Frame и NavigationService


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
// ModelMain.cs (модель)
public sealed class ModelMain
{
    private readonly NavigationService _navigationService;

	public ModelMain(NavigationService navigationService)
	{
	    _navigationService = navigationService;
	    
        AddWellCommand = new RelayCommand<Page>(page =>
        {
            var model = new EditModel(_navigationService);
            var page = new EditView {DataContext = model};
            page.Returning += AddEvent; // Нужно чтобы это событие срабатывало, при нажатии на кнопку в EditView. К кнопка подключена к команде [ public RelayCommand<Page> SaveChanges { get; private set; } ]
            _navigationService.Navigate(page);
        },
        page => true);
	}

    public void AddEvent(object sender, ReturnEventArgs<bool> e)
    {
    // ... 
    }
	
	public RelayCommand<Page> AddWellCommand { get; private set; }
}

// EditView.cs (представление)
public partial class EditView : Page
{
    public EditView()
    {
        InitializeComponent();
    }
    public void PageReturn(bool result)
    {
        RaiseReturning(new ReturnEventArgs<bool>(result));
    }
    private void RaiseReturning(ReturnEventArgs<bool> e)
    {
        var handler = Returning;
        if (handler != null) handler(this, e);
    }
    public event ReturnEventHandler<bool> Returning;
}

// EditModel.cs (модель педставления)
public sealed class EditModel
{
    private readonly NavigationService _navigationService;
    public DerectWellEditModel(NavigationService navigationService)
    {
	
	}
	
	public RelayCommand<Page> SaveChanges { get; private set; }
}
...
Рейтинг: 0 / 0
c# wpf returnig page
    #39065735
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде нашел решения. Нужно использовать не простую страницу Page, а страницу PageFunction<T>.
...
Рейтинг: 0 / 0
c# wpf returnig page
    #39066676
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такая рабочая PageFunction, у меня получилась. Код работает.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
// ModelMain.cs (модель)
public sealed class ModelMain
{
    private readonly NavigationService _navigationService;
    public RelayCommand<Page> AddWellCommand { get; private set; }
	
	public ModelMain(NavigationService navigationService)
	{
	    _navigationService = navigationService;
	    
        AddWellCommand = new RelayCommand<Page>(page =>
        {
            var model = new EditModel(_navigationService);
            var page = new PageFunctionTest {DataContext = model};
            page.Returning += AddEvent; 
            _navigationService.Navigate(page);
        },
        page => true);
	}
    public void AddEvent(object sender, ReturnEventArgs<bool> e)
    {
    // ... 
    }	
}

// PageFunctionTest.cs (представление)
public partial class PageFunctionTest : PageFunction<string> 
{
    public PageFunctionTest() 
    {
        InitializeComponent();
    }
    private void Button_Click(object sender, RoutedEventArgs e) // Событие по кнопке
    {
        OnReturn(new ReturnEventArgs<string>("ОТВЕТ"));
    }
    protected override void OnReturn(ReturnEventArgs<string> e)
    {
        RaiseReturning(e);
        base.OnReturn(e);
    }
    private void RaiseReturning(ReturnEventArgs<string> e)
    {
        var handler = Returning;
        if (handler != null) handler(this, e);
    }
    public event ReturnEventHandler<string> Returning;
}



Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
// PageFunctionTest.xaml (представления)
<PageFunction
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    x:TypeArguments="sys:String"
    x:Class="LF.Views.PageFunctionTest"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    mc:Ignorable="d"
    Title="PageFunctionTest">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Margin="51,150,0,0" VerticalAlignment="Top" Width="196" Click="Button_Click"/>
    </Grid>
</PageFunction>



Теперь, разобравшись с выше изложенным кодом. Я решил пойти дальше. Теперь я хочу PageFunction<T> вынести в абстрактный класс PageFunctionAbst<T>.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
// PageFunctionAbst.cs абстракный класс
public abstract class PageFunctionAbst<T> : PageFunction<T>
{
    protected PageFunctionEx()
    {
        KeepAlive = true;
    }
    public void PageReturn(T result)
    {
        OnReturn(new ReturnEventArgs<T>(result));
    }
    protected override void OnReturn(ReturnEventArgs<T> e)
    {
        RaiseReturning(e);
        base.OnReturn(e);
    }
    private void RaiseReturning(ReturnEventArgs<T> e)
    {
        var handler = Returning;
        if (handler != null) handler(this, e);
    }
    public event ReturnEventHandler<T> Returning;
}

// PageFunctionTest.cs теперь к текущей странице его наследую
public partial class PageFunctionTest : PageFunctionAbst<string> 
{
    public PageFunctionTest() 
    {
        InitializeComponent();
    }
}



Но почему-то при наследовании этот абстракный класс почеркивается красной ошибкой. Может мне кто нибудь объяснить, что я не так делаю?
...
Рейтинг: 0 / 0
c# wpf returnig page
    #39066687
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибку пишет следующий
partial declarations of LF.View.PageFunctionTest.cs must not specify different base classes
...
Рейтинг: 0 / 0
c# wpf returnig page
    #39066751
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В XAML-е тоже надо поменять имя класса
...
Рейтинг: 0 / 0
c# wpf returnig page
    #39066783
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProВ XAML-е тоже надо поменять имя класса
А что нужно менять, x:Class?
или тег </PageFunction>
...
Рейтинг: 0 / 0
c# wpf returnig page
    #39066839
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
второе

Код: xml
1.
2.
3.
4.
5.
<local:MyClass xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:local="clr-namespace:MyNamespace"
............./>
...
</local:MyClass>
...
Рейтинг: 0 / 0
c# wpf returnig page
    #39066942
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proвторое

Код: xml
1.
2.
3.
4.
5.
<local:MyClass xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:local="clr-namespace:MyNamespace"
............./>
...
</local:MyClass>



Сделал. Теперь ошибка circular base class dependency involving "PageFunctionTest" and "PageFunctionTest"

С x:Class что делать?
...
Рейтинг: 0 / 0
c# wpf returnig page
    #39066959
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел повнимательнее - в корневом тэге я писал базовый класс, а x:Class - реализацию
Только не знаю, как быть, если базовый класс дженерик.
...
Рейтинг: 0 / 0
c# wpf returnig page
    #39066975
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<local:PageFunctionTest
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    xmlns:local="LF.Views"
    x:TypeArguments="sys:String"
    x:Class="LF.Views.PageFunctionTest"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    mc:Ignorable="d"
    Title="PageFunctionTest">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Margin="51,150,0,0" VerticalAlignment="Top" Width="196" Click="Button_Click"/>
    </Grid>
</local:PageFunctionTest>



Я сделал так. После этого появилась эта ошибка. Пробовал убрать x:Class, сразу в классе PageFunctionTest.cs не находит метод InitializeComponent();
Я так понимаю нарушается связка в PageFunctionTest.g.i.cs
...
Рейтинг: 0 / 0
c# wpf returnig page
    #39066991
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй унаследовать PageFunctionTest
и в x:Class пропиши именно наследника
ну и в Codebehind соответственно
...
Рейтинг: 0 / 0
c# wpf returnig page
    #39067111
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProПопробуй унаследовать PageFunctionTest
и в x:Class пропиши именно наследника
ну и в Codebehind соответственно

Так как ты говорите работает. Я создал базовый класс TestStringBase и унаследовал PageFunctionAbst<string>
TestStringBase положил :
xmlns:local="LF.Views"
<local:TestStringBase>
x:Class положил соответственно страницу PageFunctionTest.

Все работает. Остался только один момент, при такой структуре потребуется создавать всегда отдельно базовый класс, а я думал сделать что-то вроде универсального дженерик класса. Который бы мне возвращал результат страницы, через один базовый джинерик класс.
...
Рейтинг: 0 / 0
c# wpf returnig page
    #39067171
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно конечно использовать PageFunctionAbst<object>, и результат определять в нужный тип. Ну это все равно не джинерик класс, который возвращает текущий тип.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / c# wpf returnig page
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]