2011-11-21 71 views
0

單個控制器我很新的WPF和C#.NET初學者。我目前正在製作一個應用程序,其中有很多頁面,觸發器更改頁面是使用Kinect SDK的手勢(觸發器方法與此問題無關)。通常當創建一個WPF文件時,會有一個類似的.cs文件附加到它,它有點像一個控制器。但是,我需要多個WPF文件/頁面才能通過單個控制器.cs文件進行控制。我如何實現這一目標?謝謝你看我的問題,你的答案會是非常讚賞:)創建多頁面WPF

回答

2

你可能想編寫一個包含您的「控制器」代碼的類,並從WPF用戶控件/頁面引用它。

在一個新的文件:

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

,然後你的用戶控件中的代碼隱藏類:

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

雖然,如果可能的話,該參數不應該是'object'但一些特定的類型。 – svick

+0

@svick當然 - 及其類別和方法應適當命名的:) –

+0

感謝您的幫助,但你的解決方案是不適用的。觸發器應該來自控制器並影響頁面,而不是相反。 – user1055010

0

背後的代碼是真正的視圖的一部分,並且是不是真的類似於一個控制器和一般有壽沒有太多的代碼。通常情況下,您需要大部分邏輯在用作視圖抽象的「視圖模型」和用作UI交互業務邏輯抽象的「模型」之間。

鑑於此我想你真正想要的是一個視圖模型(VM)控制的多個視圖。這是一個相當典型的場景和首選的方法(IMO反正)是有,有一個頂層的應用模型和一個數字,你的UI中代表不同的組件子虛擬機,雖然可以綁定一切分層視圖模型您頂級虛擬機,如果你真的想。

要做到這一點,我們首先定義我們的視圖模型,像這樣

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}}"/>