【问题标题】:Center checkbox in UniformGrid's cells in WPFWPF 中 UniformGrid 单元格的居中复选框
【发布时间】:2012-06-16 14:17:59
【问题描述】:

我想在 UniformGrid 的单元格中居中和拉伸 checkbox
我尝试了很多方法:

<UniformGrid>
        <CheckBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                  HorizontalContentAlignment="Center" VerticalContentAlignment="Center" />
        <CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" />
        <CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" ClipToBounds="True" />
        <CheckBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ClipToBounds="True" />

  • 选中的单元格(0, 0):

  • 选中的单元格(1, 0):

但这并不能让我满意,因为我想拉伸(就像在单元格(0,0)中一样)和居中(就像在 (1,0)) 中同时在它们的单元格中的那些复选框。

我该怎么做?


[编辑 1]

我正在努力做到这一点,这样我就不必单击小检查,而是可以单击整个单元格。

[编辑 2]

实际上,我想从 C# 代码中添加这些复选框,所以如果用 XAML 制作的解决方案对于 C# 语言来说不是“可移植的”,那将不是很有帮助。

【问题讨论】:

  • 您是否要这样做,以便您不必单击小检查,而是可以单击整个单元格?
  • 是的。对不起,我没有解释清楚。

标签: wpf checkbox centering stretching


【解决方案1】:

如果我将这个简单的标记与默认的 Stretch 值一起使用:

<UniformGrid>
    <CheckBox Content="This is a checkbox" />
    <CheckBox Content="This is a checkbox" />
    <CheckBox Content="This is a checkbox" />
    <CheckBox Content="This is a checkbox" />
</UniformGrid>

我可以单击 UniformGrid 的每个单元格中的任意位置来选中和取消选中该单元格中的复选框。

从功能上讲,这是做你想做的事。如果要更改复选框的外观,可以使用 ControlTemplate。

如果您不想更改 CheckBox 的大小,并且只想在视觉上居中同时能够单击单元格进行检查,则可以使用如下模板:

<CheckBox>
    <CheckBox.Template>
        <ControlTemplate TargetType="{x:Type CheckBox}">
            <Grid Background="Transparent">
                <CheckBox IsChecked="{TemplateBinding Property=IsChecked}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            </Grid>
        </ControlTemplate>
    </CheckBox.Template>
</CheckBox>

编辑:

要在运行时将其作为资源应用,请将 XAML 写入适当范围的资源部分。如果您只需要在一个控件中将其放入本地资源字典中,或者如果您希望全局访问它,则可以将其放入 App.xaml 中,如下所示:

<Application.Resources>
    <ControlTemplate x:Key="StretchedCheckBox" TargetType="{x:Type CheckBox}">
        <Grid Background="Transparent">
            <CheckBox IsChecked="{TemplateBinding Property=IsChecked}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Grid>
    </ControlTemplate>
</Application.Resources>

注意它有一个键“StretchedCheckBox”。现在您可以使用它在代码中应用它:

ControlTemplate stretchedTemplate = FindResource("StretchedCheckBox") as ControlTemplate;

CheckBox chkBox = new CheckBox();
chkBox.Template = stretchedTemplate;

【讨论】:

  • 您必须 x:Null 内部复选框的样式,否则最终会导致堆栈溢出。
  • +1 用于 CheckBox 模板,该模板使 CheckBox 居中,同时仍允许您单击网格中的任意位置以选中/取消选中它
  • @Andy 如何重现此堆栈溢出?它对我来说很好。
  • 复选框的控件模板包含一个复选框,因此它会查找包含复选框的复选框的控件模板。实际的例外是在处理类型为“System.Windows.Controls.CheckBox”的名为“”的元素的模板时发现的引用中的无限循环。
  • 对不起,我刚刚注意到您没有全局设置样式,它实际上在每个复选框内,我提到的溢出问题只会在您为所有复选框定义单一样式时发生
【解决方案2】:

我认为您不能像那样影响CheckBox 的大小,因为大小是在控件模板中预先确定的

一种解决方案是使用 LayoutTransform 将 CheckBox 缩放为更大

<CheckBox>
    <CheckBox.LayoutTransform>
        <ScaleTransform ScaleX="5" ScaleY="5" />
    </CheckBox.LayoutTransform>
</CheckBox>

应该注意的是,这会缩放 CheckBox 旁边的文本以及 CheckBox 本身,有时看起来不太好,具体取决于您如何缩放它。

另一种替代解决方案是复制example CheckBox template from MSDN,并创建一个更大的CheckBox

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 2011-06-30
    • 2013-07-23
    • 2021-12-29
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    相关资源
    最近更新 更多