2016-11-08 4 views
1

私は4つのTabItemを含むTabControlでWPFアプリケーション(UI)を作成しています。 My Application - User Tabから、私は何らかの形で(チェックボックスや他の方法で)多分、GridColumnsのどれがUserタブに表示されるかを選択したいと思います。私は他のタブで作業することができますが、時には、ユーザが必要とする特定の出力だけで作業する機会をユーザに与える必要があります。どうすればこの作品を作れますか?私はC#とwpfを初めて使っているので、単純な解答を説明してコードを提供できるなら、私はそれを説得します。いくつかのタブからグリッド列を選択し、別のタブに表示する方法は?

答えて

0

あなたの質問に答える前に、あなたに簡単なヒントを教えてください:あなたが質問したときにコードを投稿してください。そうでないと、誰かがあなたを助けるために時間を費やすことになりません。あなたのアプリケーションを実装するための

あなたが考慮する必要があります。

  1. ElementName data binding
  2. のElementNameデータはあなたがこれを読むことができるポイント数2を解決するためにColumnDefinitionsプロパティ

で作業することはできません結合非常に興味深いarticle by Josh Smith

Pratically彼は、添付プロパティとElementSpyの特別な種類を作成します。

public class ElementSpy : Freezable 
{ 
    private DependencyObject element; 

    public static ElementSpy GetNameScopeSource(DependencyObject obj) 
    { 
     return (ElementSpy)obj.GetValue(NameScopeSourceProperty); 
    } 

    public static void SetNameScopeSource(DependencyObject obj, ElementSpy value) 
    { 
     obj.SetValue(NameScopeSourceProperty, value); 
    } 

    public static readonly DependencyProperty NameScopeSourceProperty = 
     DependencyProperty.RegisterAttached("NameScopeSource", typeof(ElementSpy), typeof(ElementSpy), 
      new UIPropertyMetadata(null, OnNameScopeSourceProperty)); 

    private static void OnNameScopeSourceProperty(DependencyObject d, DependencyPropertyChangedEventArgs args) 
    { 
     INameScope nameScope; 
     ElementSpy elementSpy = args.NewValue as ElementSpy; 

     if (elementSpy != null && elementSpy.Element != null) 
     { 
      nameScope = NameScope.GetNameScope(elementSpy.Element); 
      if (nameScope != null) 
      { 
       d.Dispatcher.BeginInvoke(new Action<DependencyObject, INameScope>(SetScope), 
        System.Windows.Threading.DispatcherPriority.Normal, 
        d, nameScope); 
      } 
     } 
    } 

    private static void SetScope(DependencyObject d, INameScope nameScope) 
    { 
     NameScope.SetNameScope(d, nameScope); 
    } 

    public DependencyObject Element 
    { 
     get 
     { 
      if (element == null) 
      { 
       PropertyInfo propertyInfo = typeof(Freezable).GetProperty("InheritanceContext", 
        BindingFlags.NonPublic | BindingFlags.Instance); 

       element = propertyInfo.GetValue(this, null) as DependencyObject; 

       if (element != null) 
       { 
        Freeze(); 
       } 
      } 

      return element; 
     } 
    } 

    protected override Freezable CreateInstanceCore() 
    { 
     return new ElementSpy(); 
    } 
} 

は、今、私たちは私たちのコードを完了するために私たちのXAMLで

<Window.Resources> 
    <local:BooleanWidthConverter x:Key="BooleanWidthConverter" /> 
    <local:ElementSpy x:Key="ElementSpy" /> 
</Window.Resources> 

    <StackPanel HorizontalAlignment="Stretch"> 
    <Grid local:ElementSpy.NameScopeSource="{StaticResource ElementSpy}" 
      Margin="0,0,0,30"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="{Binding ElementName=cb1, Path=IsChecked, Converter={StaticResource BooleanWidthConverter}, Mode=OneWay}" /> 
      <ColumnDefinition Width="{Binding ElementName=cb2, Path=IsChecked, Converter={StaticResource BooleanWidthConverter}, Mode=OneWay}" /> 
      <ColumnDefinition Width="{Binding ElementName=cb3, Path=IsChecked, Converter={StaticResource BooleanWidthConverter}, Mode=OneWay}" /> 
     </Grid.ColumnDefinitions> 

     <TextBlock HorizontalAlignment="Center" Text="Column 1" Margin="4" Grid.Column="0" /> 
     <TextBlock HorizontalAlignment="Center" Text="Column 2" Margin="4" Grid.Column="1" /> 
     <TextBlock HorizontalAlignment="Center" Text="Column 3" Margin="4" Grid.Column="2" /> 

    </Grid> 

    <CheckBox x:Name="cb1" Content="Column 1" Margin="4" IsChecked="true" HorizontalAlignment="Center" /> 
    <CheckBox x:Name="cb2" Content="Column 2" Margin="4" IsChecked="true" HorizontalAlignment="Center" /> 
    <CheckBox x:Name="cb3" Content="Column 3" Margin="4" IsChecked="true" HorizontalAlignment="Center" /> 
</StackPanel> 

をバインディングを使用することができ、我々は、単純なコンバータが必要になります。

public class BooleanWidthConverter : IValueConverter 
{ 
    private static GridLength star = new GridLength(1, GridUnitType.Star); 
    private static GridLength zero = new GridLength(0, GridUnitType.Pixel); 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     bool boolValue = (bool)value; 

     return boolValue ? star : zero; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

もちろんこれはサンプルのプロトタイプですが、私は確信していますそれはあなたのアプリケーションであなたを助けることができます。

関連する問題