Создание одного контроллера для нескольких страниц WPF - PullRequest
0 голосов
/ 21 ноября 2011

Я очень новичок в WPF и новичок в C # .NET.В настоящее время я делаю приложение, в котором будет много страниц, и триггер для изменения страницы - жест рукой, используя Kinect SDK (метод триггера не имеет отношения к этому вопросу).Обычно, когда создается файл WPF, к нему прикрепляется файл с аналогичным именем .cs, который действует как контроллер.Однако мне нужно, чтобы несколько файлов / страниц WPF контролировались только одним файлом .cs контроллера.Как мне этого добиться?Спасибо за просмотр моего вопроса, и ваш ответ будет очень признателен:)

Ответы [ 2 ]

2 голосов
/ 21 ноября 2011

Возможно, вы захотите написать класс, содержащий код вашего «контроллера», и ссылаться на него из ваших пользовательских элементов управления WPF / Pages.

В новом файле:

public class MyController
{
    public void DoThings(object parameter)
    {
        // stuff you want to do 
    }
}

, а затем внутри вашего класса кода позади UserControl:

public partial class MyWpfControl : UserControl
{
    private MyController controller;

    public MyWpfControl
    {
        this.controller = new MyController();
    }
}

и, наконец, свяжите ваши события с методом контроллера:

private void OnGesture(object sender, EventArgs e)
{
    // call the method on the controller, and pass whatever parameters you need...
    this.controller.DoThings(e);
}
1 голос
/ 21 ноября 2011

Код на самом деле является частью представления и на самом деле не аналогичен контроллеру, и обычно в них не должно быть много кода.Как правило, вы хотели бы большую часть вашей логики между «моделью представления», которая служит абстракцией представления, и «моделью», которая служит абстракцией бизнес-логики, с которой взаимодействует ваш пользовательский интерфейс.

В этомЯ думаю, что вам действительно нужна модель представления (VM), которая управляет несколькими представлениями.Это довольно типичный сценарий, и предпочтительный метод (во всяком случае, IMO) состоит в том, чтобы иметь модель иерархического представления, которая имеет модель приложения верхнего уровня, и несколько вспомогательных виртуальных машин, представляющих различные компоненты в вашем пользовательском интерфейсе, хотя вы можете связать все сVM верхнего уровня, если вы действительно хотите.

Для этого мы сначала определим нашу модель представления следующим образом:

public interface IGestureSink
{
    void DoGesture();
}

public class MyControlVM : INotifyPropertyChanged, IGestureSink
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    private ApplicationVM parent;
    public MyControlVM(ApplicationVM parent)
    {
        this.Name = "my user control";
        this.parent = parent;
        parent.PropertyChanged += (s, o) => PropertyChanged(this, new PropertyChangedEventArgs("Visible"));
    }

    public String Name { get; set; }
    public bool Visible { get { return parent.ControlVisible; } }
    public void DoGesture()
    {
        parent.DoGesture();
    }
}

public class ApplicationVM : INotifyPropertyChanged, IGestureSink
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    public ApplicationVM()
    {
        this.ControlVM = new MyControlVM(this);
        this.ControlVisible = false;
    }
    public MyControlVM ControlVM { get; private set; }
    public bool ControlVisible {get; set;}

    public void DoGesture()
    {
        this.ControlVisible = !this.ControlVisible;
        PropertyChanged(this, new PropertyChangedEventArgs("ControlVisible"));
    }
}

, а затем все, что нам нужно сделать, - это создать пользовательский элемент управления

<UserControl x:Class="WpfApplication2.MyControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid Background="LightBlue">
        <Label Content="{Binding Name}"/>
    </Grid>
</UserControl>

и стр.

<Window xmlns:my="clr-namespace:WpfApplication2"  x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
    </Window.Resources>
    <Grid>
        <my:MyControl Width="200" Height="200" x:Name="myUserControl" DataContext="{Binding ControlVM}" Visibility="{Binding Visible,Converter={StaticResource BooleanToVisibilityConverter}}"/>
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="222,262,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</Window>

Вот и используйте его.Единственное, что нам нужно в нашем коде, - это конструктор, который настраивает виртуальную страницу и проводку от нашей кнопки к модели представления.

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new ApplicationVM();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        ((IGestureSink)(this.DataContext)).DoGesture();
    }
}

Если вы хотите использовать вместо этого модель монолитного представления, вы быиспользуйте это вместо привязки DataContext к ControlVM:

<my:MyControl Width="200" Height="200" x:Name="myUserControl" DataContext="{Binding DataContext}" Visibility="{Binding ControlVisible,Converter={StaticResource BooleanToVisibilityConverter}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...