2012-03-16 80 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 
相关问题