11

我正在使用 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,尽管用户控件将其定义为在启动时始终检查。

此外,在后面的代码中将单选按钮设置为已选中似乎会取消选中其他选项卡中的所有单选按钮!

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

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

感谢任何人对此的帮助。我进行了广泛的搜索,但无济于事。当然,我不是唯一遇到这个问题的人。我正在使用VS2008。

4

3 回答 3

16

没有 GroupName 设置它可以工作。这不是绝对必要的,因为一个容器中的 RadioButtons 无论如何都会自动分组。例如:

<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>
于 2010-05-20T07:11:29.330 回答
6

此行为是设计使然:

GroupName 的全部意义在于允许您定义充当组的单选按钮,而不必包含在同一个父面板中。

请阅读这篇文章以获得详细的解释。

简而言之,对于两种不同的情况,有两种解决方案:

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

  • 如果出于布局目的将逻辑相关的单选按钮拆分到多个面板中,请阅读文章以获取详细说明。

于 2013-06-25T01:16:30.717 回答
0

我有一种情况,设计不允许将无线电分离成单独的堆栈。所以,我所做的是GroupName从 xaml 中删除并从模型中强制分组。这个想法来自这个链接,例如

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");
    }
 }
于 2014-04-09T13:47:27.013 回答