TabControl - 将ToggleButtons作为TabSeletors(仅限XAML逻辑)

时间:2015-11-09 15:02:19

标签: c# wpf xaml tabcontrol wpf-style

目前我有一套ToggleButtons。 我想根据选中的按钮显示我的TabControl的不同Tab。基本上相同的bahaviour就像选择了不同的Tab一样。不确定我的需求是否无稽之谈。我希望SelectedTab根据单击的按钮进行更改。此外,我的ToggleButtons是固定到Togglebuttons的RadioButtons(我只希望一次检查一个)。我想尝试仅在XAML中实现我的需求(如果可能的话)。

所以这是我的XAML的一部分:

<Window.Resources>
    <sys:Int32 x:Key="CurrentTab"></sys:Int32>
    <Style TargetType="RadioButton" BasedOn="{StaticResource {x:Type ToggleButton}}">
        <Style.Triggers>
            <Trigger Property="IsChecked" Value="True">
                <Setter Property="Background" Value="Aqua"></Setter>
            </Trigger>
        </Style.Triggers>
        <Setter Property="Background" Value="Transparent"></Setter>
    </Style>
</Window.Resources>

    <TabControl Grid.Row="1"
                Grid.Column="1"
                Grid.ColumnSpan="2"
                SelectedIndex="{StaticResource CurrentTab}">
        <TabItem Visibility="Collapsed"></TabItem>
        <TabItem Visibility="Collapsed"></TabItem>
    </TabControl>

我在想的是(pseudoCode)

<Setter Target="{StaticResource CurrentTab}" Value="{ButtonsToolTip}></Setter>

基本上甚至可以为XAML中的变量赋值,如果是 - 如何?

作为一个示例,我尝试实现的原因和内容类似于此GUI:

http://cache.filehippo.com/img/ex/3049__ccleaner1.png

2 个答案:

答案 0 :(得分:2)

  1. 您无法使用xaml更改声明为资源的基本类型的值。但是您可以使用对象的属性作为变量。例如;

    <sys:Int32 x:Key="IntKey">12</sys:Int32>
    

    使用XAML是不可修改的。但是,DictionaryEntry的Value属性(如下所示)是可修改的,尽管像int(IntKey)一样,DEKey也是不可修改的。

    <coll:DictionaryEntry x:Key="DEKey" Key="TagKey" Value="100"/>
    
  2. 如果我尝试通过绑定更改整数(IntKey),它就不会允许。例如; <TextBox Text="{Binding Mode=OneWay,Source={StaticResource IntKey}}"/>,模式必须是OneWay。 TwoWay,不允许OneWayToSource值。

    但我可以写

    <TextBox  Text="{Binding Value,Source={StaticResource DEKey}}"/> 
    

    ,任何文本框值都将在DictionaryEntry(DEKey)的值中更新。注意,双向绑定不起作用,因为DictionaryEntry不是DependencyObject。但您现在可以按照自己喜欢的方式更改变量(Value属性)。但唯一值得关注的是:对Value属性的更改不会反映在有限控制中。

    1. 是的,您可以利用上述信息来显示标签w.r.t. radiobuttons的方法如下。为了使绑定能够正常工作,我们需要DependencyObject和DependencyProperty,因此我们使用FrameworkElement及其Tag属性。
    2. 此Tag属性现在模仿您的变量。

          <Window.Resources>
              <FrameworkElement x:Key="rbTagHolder" Tag="0"/>
          </Window.Resources>
          ...
          <ItemsControl x:Name="RadioButtonList">
              <ItemsControl.ItemTemplate>
                 <DataTemplate>
                    <RadioButton Content="{Binding TabName}" Tag="{Binding TagValue}" GroupName="Choice">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                          <ei:ChangePropertyAction TargetObject="{DynamicResource rbTagHolder}" PropertyName="Tag" Value="{Binding Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1, AncestorType={x:Type RadioButton} }}"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    </RadioButton>
                  </DataTemplate>
              </ItemsControl.ItemTemplate>
              <ItemsControl.ItemsPanel>
                  <ItemsPanelTemplate>
                     <StackPanel Orientation="Horizontal"/>
                  </ItemsPanelTemplate>
              </ItemsControl.ItemsPanel>
          </ItemsControl>
          ...
          <TabControl x:Name="TabCtrl" SelectedIndex="{Binding Tag, Source={StaticResource rbTagHolder}}"> ... </TabControl>
      

      代码隐藏

      RadioButtonList.ItemsSource = new[] { new { TabName = "Tab1", TagValue = "0" }, new { TabName = "Tab2", TagValue = "1" },
                      new { TabName = "Tab3", TagValue = "2" }, new { TabName = "Tab4", TagValue = "3" }};
      

      以防您不知道如何使用混合行为。

      一个。包括以下命名空间:

      xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
      xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
      

      B中。添加对以下内容的引用:Microsoft.Expression.Interactions,System.Windows.Interactivity在我的系统上,这些可以在

      中找到

      C:\ Program Files(x86)\ Microsoft SDKs \ Expression \ Blend.NETFramework \ v4.0 \ Libraries

答案 1 :(得分:1)

单独使用XAML中的事件触发器无法更改StaticResource的值。这必须通过将StaticResource绑定到ViewModel的属性或使用后面的代码来完成。