2012-03-16 79 views
0

我創建了兩個WPF用戶控件,它們具有多個文本框,組合框和按鈕。在主wpf窗口中,我創建了一個Canvas和一個包含兩個列表項的列表框。我的要求是,如果選擇第一個列表框項目,第一個用戶控件應該被添加到畫布。如果我選擇第二個列表框項目,則先前添加的用戶控件應該隱藏,而第二個應該添加/顯示。任何人都可以提供此代碼的示例嗎?在WPF中在畫布上添加/刪除用戶控件

下面是代碼我有writtent.I創建了兩個用戶控件。

UserControl1.xaml

<UserControl x:Class="UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="210" Height="210" x:Name="UCntl1"> 
    <Grid> 
     <StackPanel> 
     <GroupBox Header="Text Boxes"> 
      <StackPanel Orientation="Horizontal"> 
       <StackPanel> 
        <Label Margin="4" Height="21">TextBox1</Label> 
        <Label Margin="4" Height="21">TextBox2</Label> 
        <Label Margin="4" Height="21">TextBox3</Label> 
       </StackPanel> 
       <StackPanel> 
        <TextBox Width="100" Height="21" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="4">0.1</TextBox> 
        <TextBox Width="100" Height="21" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="4">0.2</TextBox> 
        <TextBox Width="100" Height="21" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="4">0.3</TextBox> 
       </StackPanel> 
      </StackPanel> 
     </GroupBox> 
      <GroupBox Header="Conbo Boxes"> 
       <StackPanel Orientation="Horizontal"> 
        <StackPanel> 
         <Label Margin="4" Height="21">ComboBox1</Label> 
         <Label Margin="4" Height="21">ComboBox2</Label> 
         <Label Margin="4" Height="21">ComboBox3</Label> 
        </StackPanel> 
        <StackPanel> 
         <ComboBox Width="100" Height="21" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="4"> 
          <ComboBoxItem>Item AAA</ComboBoxItem> 
         </ComboBox> 
         <ComboBox Width="100" Height="21" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="4"> 
          <ComboBoxItem>Item BBB</ComboBoxItem> 
         </ComboBox> 
         <ComboBox Width="100" Height="21" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="4"> 
          <ComboBoxItem>Item CCC</ComboBoxItem> 
         </ComboBox> 
        </StackPanel> 
       </StackPanel> 
      </GroupBox> 
     </StackPanel> 
    </Grid> 
</UserControl> 

UserControl2.xaml

<UserControl x:Class="UserControl2" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="210" Height="210" x:Name="UCntl2"> 
<Grid> 
    <StackPanel> 
     <GroupBox Header="Conbo Boxes"> 
      <StackPanel Orientation="Horizontal"> 
       <StackPanel> 
        <Label Margin="4" Height="21">ComboBox1</Label> 
        <Label Margin="4" Height="21">ComboBox2</Label> 
        <Label Margin="4" Height="21">ComboBox3</Label> 
       </StackPanel> 
       <StackPanel> 
        <ComboBox Width="100" Height="21" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="4"></ComboBox> 
        <ComboBox Width="100" Height="21" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="4"></ComboBox> 
        <ComboBox Width="100" Height="21" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="4"></ComboBox> 
       </StackPanel> 
      </StackPanel> 
     </GroupBox> 
     <GroupBox Header="Text Boxes"> 
      <StackPanel Orientation="Horizontal"> 
       <StackPanel> 
        <Label Margin="4" Height="21">TextBox1</Label> 
        <Label Margin="4" Height="21">TextBox2</Label> 
        <Label Margin="4" Height="21">TextBox3</Label> 
       </StackPanel> 
       <StackPanel> 
        <TextBox Width="100" Height="21" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="4"></TextBox> 
        <TextBox Width="100" Height="21" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="4"></TextBox> 
        <TextBox Width="100" Height="21" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="4"></TextBox> 
       </StackPanel> 
      </StackPanel> 
     </GroupBox> 
    </StackPanel> 
</Grid> 

Window1.xaml

<Window x:Class="Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="Auto" Width="Auto"> 
<Grid> 
    <StackPanel Orientation="Horizontal"> 
     <Grid Margin="0,0,0,0" Width="Auto" Height="Auto" VerticalAlignment="Top"> 
      <ListBox Margin="0,0,0,0" HorizontalAlignment="Left" Width="Auto" Height="Auto" VerticalAlignment="Top" BorderBrush="White"> 
       <ListBoxItem Name="LstItem1" Selected="LstItem1_Selected">User Control 1</ListBoxItem> 
       <ListBoxItem Name="LstItem2" Selected="LstItem2_Selected">User Control 2</ListBoxItem> 
      </ListBox> 
     </Grid> 
     <Grid Width="10" Background="LightGray"></Grid> 
     <Grid Margin="0,0,0,0"> 
      <Canvas Name="Canvas1" Width="210" Height="210" VerticalAlignment="Top"> 

      </Canvas> 
     </Grid> 

    </StackPanel> 
</Grid> 

Widow1.xaml.vb

Class Window1 

Private Sub LstItem1_Selected(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 
    Canvas1.Children.Clear() 
    Canvas1.Children.Add(New UserControl1) 
End Sub 

Private Sub LstItem2_Selected(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 
    Canvas1.Children.Clear() 
    Canvas1.Children.Add(New UserControl2) 
End Sub 

末級

問題

我在畫布刪除以前的控制後添加的用戶控制。因此,在將控件重新添加到畫布時,UserControl中列表框中的選定值將被清除。是否有任何方法來隱藏畫布上的usercontrols,而不是從畫布中刪除控件。

回答

1

這應該讓你開始。這不完全是我在一個真實的項目中做的,但足夠接近。我希望有一個簡單的方法來將項目附加到本網站的答案。

最終的結果看起來是這樣的:

enter image description here enter image description here

的App.xaml

<Application x:Class="SO9735486.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:vm="clr-namespace:SO9735486.ViewModels" 
      xmlns:v="clr-namespace:SO9735486.Views" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <DataTemplate DataType="{x:Type vm:MainViewModel}"> 
      <v:MainView/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type vm:FirstContentViewModel}"> 
      <v:FirstContentView/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type vm:SecondContentViewModel}"> 
      <v:SecondContentView/> 
     </DataTemplate> 
    </Application.Resources> 
</Application> 

MainWindow.xaml

<Window x:Class="SO9735486.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow"> 
</Window> 

MainWindow.xaml.cs

namespace SO9735486 
{ 
    using System.Windows; 
    using SO9735486.ViewModels; 

    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      this.Content = new MainViewModel(); 
     } 
    } 
} 

ViewModel.cs

namespace SO9735486.ViewModels 
{ 
    using System; 
    using System.ComponentModel; 
    using System.Windows; 
    using System.Windows.Threading; 

    // http://kentb.blogspot.com/2009/04/mvvm-infrastructure-viewmodel.html 
    public abstract class ViewModel : INotifyPropertyChanged 
    { 
     private readonly Dispatcher _dispatcher; 

     protected ViewModel() 
     { 
      if (Application.Current != null) 
      { 
       _dispatcher = Application.Current.Dispatcher; 
      } 
      else 
      { 
       //this is useful for unit tests where there is no application running 
       _dispatcher = Dispatcher.CurrentDispatcher; 
      } 

     } 

     [field: NonSerialized] 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected Dispatcher Dispatcher 
     { 
      get { return _dispatcher; } 
     } 

     protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) 
     { 
      var handler = this.PropertyChanged; 

      if (handler != null) 
      { 
       handler(this, e); 
      } 
     } 

     protected void OnPropertyChanged(string propertyName) 
     { 
      OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

ContentViewModel。CS

namespace SO9735486.ViewModels 
{ 
    public abstract class ContentViewModel : ViewModel 
    { 
     private readonly string displayName; 

     protected ContentViewModel(string displayName) 
     { 
      this.displayName = displayName; 
     } 

     public string DisplayName 
     { 
      get { return this.displayName; } 
     } 
    } 
} 

FirstContentViewModel.cs

namespace SO9735486.ViewModels 
{ 
    public sealed class FirstContentViewModel : ContentViewModel 
    { 
     private string name; 

     public FirstContentViewModel() 
      : base("First") 
     { 
     } 

     public string Name 
     { 
      get { return this.name; } 
      set 
      { 
       if (this.name != value) 
       { 
        this.name = value; 
        this.OnPropertyChanged("Name"); 
       } 
      } 
     } 
    } 
} 

SecondContentViewModel.cs

namespace SO9735486.ViewModels 
{ 
    public sealed class SecondContentViewModel : ContentViewModel 
    { 
     public SecondContentViewModel() 
      : base("Second") 
     { 
     } 
    } 
} 

MainViewModel.cs

namespace SO9735486.ViewModels 
{ 
    using System.Collections.Generic; 
    using System.Linq; 

    public sealed class MainViewModel : ViewModel 
    { 
     private readonly ICollection<ContentViewModel> contentViewModels; 
     private ContentViewModel selectedContentViewModel; 

     public MainViewModel() 
     { 
      this.contentViewModels = new List<ContentViewModel> 
      { 
       new FirstContentViewModel(), 
       new SecondContentViewModel() 
      }; 

      this.selectedContentViewModel = this.contentViewModels.First(); 
     } 

     public ICollection<ContentViewModel> ContentViewModels 
     { 
      get { return this.contentViewModels; } 
     } 

     public ContentViewModel SelectedContentViewModel 
     { 
      get { return this.selectedContentViewModel; } 
      set 
      { 
       if (this.selectedContentViewModel != value) 
       { 
        this.selectedContentViewModel = value; 
        this.OnPropertyChanged("SelectedContentViewModel"); 
       } 
      } 
     } 
    } 
} 

FirstContentView.xaml

<UserControl x:Class="SO9735486.Views.FirstContentView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
     <Label>First Content View</Label> 
     <TextBox Text="{Binding Name}"/> 
    </StackPanel> 
</UserControl> 

SecondContentView.xaml

<UserControl x:Class="SO9735486.Views.SecondContentView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
     <Label>Second content view</Label> 
     <Rectangle Fill="Blue" Width="100" Height="30"/> 
    </StackPanel> 
</UserControl> 

MainView.xaml

<UserControl x:Class="SO9735486.Views.MainView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <DockPanel> 
     <ComboBox DockPanel.Dock="Top" ItemsSource="{Binding ContentViewModels}" SelectedItem="{Binding SelectedContentViewModel}" DisplayMemberPath="DisplayName"/> 
     <ContentControl Content="{Binding SelectedContentViewModel}"/> 
    </DockPanel> 
</UserControl> 
+0

能否請你看在我的問題上面貼的代碼,如果你有這個 – Rahul 2012-03-20 08:23:38

+0

Boogaart感謝您尋找到這個解決方案的任何回覆我。我得到了答案。而不是從畫布中移除控件(CanvasForm.Clear),我應該將控件的可見性設置爲Collapsed。我發佈了這個答案。由於我是這個領域的新手(WinForms和WPF),我不知道可見性屬性。再次感謝您的時間。 – Rahul 2012-03-21 09:26:18

0

僅針對Windows1.xaml.vb所做的更改。代碼隱藏文件應該如下。問題的答案是,而不是callinf Canvas1.Clear(),將添加的用戶控件的可見性設置爲Windows.Visibility.Collapsed。

Window1.xaml.vb

Class Window1 
Private U1 As Integer 
Private U2 As Integer 
Private Sub LstItem1_Selected(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 
    Canvas1.Children.Item(U1).Visibility = Windows.Visibility.Visible 
    Canvas1.Children.Item(U2).Visibility = Windows.Visibility.Collapsed 
End Sub 

Private Sub LstItem2_Selected(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 
    Canvas1.Children.Item(U2).Visibility = Windows.Visibility.Visible 
    Canvas1.Children.Item(U1).Visibility = Windows.Visibility.Collapsed 
End Sub 

Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded 
    U1 = Canvas1.Children.Add(New UserControl1) 
    U2 = Canvas1.Children.Add(New UserControl2) 

    Canvas1.Children.Item(U1).Visibility = Windows.Visibility.Collapsed 
    Canvas1.Children.Item(U2).Visibility = Windows.Visibility.Collapsed 
End Sub 
End Class 
相關問題