gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:53:52 25 4
gpt4 key购买 nike

目前我有一组 ToggleButtons。我想根据选中的按钮显示 TabControl 的不同选项卡。基本上与选择不同选项卡时的行为相同。不确定我的需求是否无稽之谈,但无论如何。我希望 SelectedTab 根据单击哪个按钮而改变。此外,我的 ToggleButtons 是 RadioButtons STLyed to Togglebuttons(我只想一次检查一个)。我想尝试仅在 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

最佳答案

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

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

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

    <coll:DictionaryEntry x:Key="DEKey" Key="TagKey" Value="100"/>

如果我尝试通过绑定(bind)更改 integer(IntKey),它不会允许。例如; <TextBox Text="{Binding Mode=OneWay,Source={StaticResource IntKey}}"/> , Mode 必须是 OneWay。不允许使用 TwoWay、OneWayToSource 值。

但是我会写

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

并且任何文本框值都将在 DictionaryEntry(DEKey) 的值中更新。请注意,双向绑定(bind)将不起作用,因为 DictionaryEntry 不是 DependencyObject。但是您现在可以按照自己喜欢的方式更改变量(Value 属性)。但唯一需要注意的是:对 Value 属性的更改不会在有界控件中反射(reflect)回来。

  1. 是的,您可以利用上述信息来显示标签 w.r.t。具有下面给出方法的单选按钮。为了使绑定(bind)在两种方式下都能正常工作,我们需要一个 DependencyObject 和一个 DependencyProperty,因此我们使用 FrameworkElement 及其 Tag 属性。

此 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

关于c# - TabControl - ToggleButtons 作为 TabSeletors(仅限 XAML 逻辑),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33611970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com