【问题标题】:WPF: Placing textbox next to radiobutton in stackpanelWPF:将文本框放在堆栈面板中的单选按钮旁边
【发布时间】:2012-12-11 12:22:42
【问题描述】:

我有一个包含两个单选按钮(Option 1Option 2)的堆栈面板。如果用户选择选项 2,则应激活一个文本框,允许用户提供有关选项 2 的更多详细信息。

我想出了两个解决方案,但都不是我想要的。它们是这样的:

解决方案 #1

解决方案 #1 的 XAML 代码非常简单,结果非常明显:

    <StackPanel Grid.Row="7" Grid.Column="1">
        <RadioButton>Option 1</RadioButton>
        <RadioButton>Option 2:</RadioButton>
        <TextBox>Some Text that details option 2</TextBox>
    </StackPanel>

这里的好处是文本框使用了整个宽度。然而,这不是我想要的,因为文本框应该放在选项 2 旁边。

解决方案 #2

下一步是在 RadioButton-tags 中创建一个网格。这使我可以将文本框放置在正确的位置,但宽度不再缩放到 100 %。

代码如下所示:

    <StackPanel Grid.Row="8" Grid.Column="1">
        <RadioButton>Option 1</RadioButton>
        <RadioButton>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="130*" />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" >Option 2:</TextBlock>
                <TextBox Grid.Column="1" Margin="10,0,0,0">Some Text that details option 2</TextBox>
            </Grid>
        </RadioButton>
    </StackPanel>

除了在我看来这是一个设计过度的解决方案之外,问题就在这里:如何将单选按钮条目中的网格宽度设置为 100%?

此处提出了类似的问题 (How to set width to 100% in WPF),但使用 ItemContainerStyle 属性不适用于单选按钮。

在我看来,一定有一个更简单(或至少可行)的解决方案。有人可以帮忙吗?

【问题讨论】:

    标签: c# wpf xaml radio-button


    【解决方案1】:

    你可以尝试很多东西 -

    1. 将第二个 RadioButton 的 Horizo​​ntalAlignment 设置为“Stretch”;
    2. 尝试将其设置在 Grid 上;
    3. 将 ColumnDefinition 设置为“Auto”而将另一个 ColumnDefinition 设置为“130*”并没有任何意义。将第一个设置为 Auto(根据内容调整大小),第二个设置为“*”(使用所有可用空间)

    * 大小是相对的。如果你有 1* 和 2*,2* 总是 1* 的两倍。 0.5* 和 1* 也​​是一样,第一个总是 1* 的一半。

    您是否尝试将 ColumnDefinitions 都设置为 Auto?

    另外,您可以用来解决此类问题的方法是在元素周围应用边框(每个元素都有不同的边框颜色)。它有助于找出哪个控件是罪魁祸首。

    【讨论】:

    • Horizo​​ntalAlignment 不够,应该设置Horizo​​ntalContentAlignment
    【解决方案2】:

    使用这个:

    <StackPanel Grid.Row="8"
                Grid.Column="1">
        <RadioButton>Option 1</RadioButton>
        <RadioButton HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch">
            <DockPanel  LastChildFill="True">
                <TextBlock >Option 2:</TextBlock>
                <TextBox Grid.Column="1"  
                         Margin="10,0,0,0">Some Text that </TextBox>
            </DockPanel>
        </RadioButton>
    </StackPanel>
    

    或者如果你想保留网格:

     <StackPanel Grid.Row="8"
                Grid.Column="1">
        <RadioButton>Option 1</RadioButton>
        <RadioButton HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch">
            <Grid  HorizontalAlignment="Stretch">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <TextBlock >Option 2:</TextBlock>
                <TextBox Grid.Column="1"  
                         Margin="10,0,0,0">Some Text that </TextBox>
            </Grid>
        </RadioButton>
    </StackPanel>
    

    【讨论】:

    • 您更喜欢哪种解决方案?对我来说,网格解决方案更直观一些。你怎么看?
    • 我更喜欢 DockPanel。
    【解决方案3】:

    您可以随心所欲地进行设计。只需将相同的GroupName 应用于所有 RadioButtons

    <StackPanel>
        <RadioButton Content="Option1" GroupName="Question" />
        <StackPanel Orientation="Horizontal">
            <RadioButton Content="Option2" GroupName="Question" />
            <TextBox Text="Other controls"/>
        </StackPanel>
    </StackPanel>
    

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      相关资源
      最近更新 更多