WPF用户控件在单独的选项卡上:为什么单选按钮组名称在选项卡之间共享?

12

我正在使用WPF选项卡控件来呈现用户控件的不同重复实例。例如,Tab1用于Item1设置,Tab2用于Item2设置,等等。

似乎单选按钮组名称在选项卡之间共享。这是怎么回事?

简单示例:

一个窗口包含标签页。每个标签页包含一个用户控件。

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:lib="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="300">
<Grid>
    <TabControl Margin="0,0,0,100" Name="tabControl1">
        <TabItem Header="tabItem1" Name="tabItem1">
            <lib:UserControl1 x:Name="userControlInTab1" />
        </TabItem>
        <TabItem Header="tabItem2" Name="tabItem2">
            <lib:UserControl1 x:Name="userControlInTab2" />
        </TabItem>
    </TabControl>
</Grid>

用户控件只是一组两个单选按钮:

<UserControl x:Class="WpfApplication1.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="50" Width="100">
<StackPanel>
    <RadioButton GroupName="Group1" Name="radiobutton1" Content="option1" IsChecked="True" />
    <RadioButton GroupName="Group1" Name="radiobutton2" Content="option2" />
</StackPanel>

如果你运行这个应用程序,你会发现只有第二个选项卡中的radiobutton1被选中,尽管用户控件定义它在启动时总是被选中。

此外,在代码后台将一个radiobutton设置为选中似乎会取消其他选项卡中所有radiobutton的选中状态!

在鼠标控制下,事情似乎表现良好(即选项卡是独立的)。

最后,用户控件似乎是单独实例化的。例如,我已经尝试过在用户控件上使用滑块,它们在选项卡之间确实独立地工作。正如它们应该的那样。

感谢任何人对此的帮助。我已经广泛搜索但没有结果。肯定不是只有我遇到这个问题。我正在使用VS2008。

4个回答

16

如果不设置GroupName,它也可以工作。因为同一容器中的单选按钮会自动分组,所以这并非严格必要。例如:

<UserControl x:Class="WpfApplication1.UserControl1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Height="50" Width="100">
    <StackPanel>
        <StackPanel>
            <RadioButton  Name="radiobutton1" Content="option1" IsChecked="True" />
            <RadioButton  Name="radiobutton2" Content="option2" />
        </StackPanel>
        <StackPanel>
            <RadioButton  Name="radiobutton3" Content="option3" IsChecked="True" />
            <RadioButton  Name="radiobutton4" Content="option4" />
        </StackPanel>
    </StackPanel>
</UserControl>

1
工作已完成。谢谢。所以,组名属性似乎完全没有必要,您总是可以将单选按钮分成容器... - Daniel
没错。只有在想要将单选按钮分组到同一个容器中时,才需要 GroupName。但即使如此,您也可以将它们放在空边框或类似的容器中。 - Daniel Rose
如果您想要不同容器下的两个单选按钮属于同一组怎么办?例如,您在不同的堆栈面板中有两个单选按钮(由于某种原因),但只想选择其中一个? - digitguy
1
@digitguy 在这种情况下,您应该在不同容器中为单选按钮使用GroupName。如果设置相同的组名,它将好像它们在同一个容器中。 GroupName 正是您所描述的场景中使用的。 - Hannish

7

这种行为是有意设计的:

GroupName 的整个目的是允许您定义单选按钮作为一个组,而不必被同一父面板所包含。

请阅读 this article 以获得详细解释。

简要地说,有两种不同情况的解决方案:

  • 如果您将所有逻辑相关的单选按钮放在一个容器中,则不要指定 GroupName。在这种情况下,单选按钮将自动形成一个独立于任何其他单选按钮组的组。

  • 如果您为布局目的将逻辑相关的单选按钮分散在多个面板上,则阅读文章以获取详细说明。


0

我遇到了一个情况,即设计不允许将收音机分离成单独的堆栈。因此,我从xaml中删除了GroupName并从模型中强制进行分组。这个想法来自于这个链接

private bool _useGaugeOpen;
public bool UseGaugeOpen
{
    get { return _useGaugeOpen; }
    set
    {
        _useGaugeOpen = value;
        _useATGOpen = !value;
        RaisePropertyChanged("UseATGOpen");            
    }
}
private bool _useATGOpen;
public bool UseATGOpen
{
    get { return _useATGOpen; }
    set
    {
         _useATGOpen = value;
         _useGaugeOpen = !value;
         RaisePropertyChanged("UseGaugeOpen");
    }
 }

0

我通过在XAML属性框下的/Common/GroupName中一致地为每组单选按钮命名,解决了我的问题。现在它们只与同一组中的其他按钮互动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接