如何使用控件模板设置控件的宽度或高度属性?

3

如何使用ControlTemplate设置控件的宽度或高度?

例如,我有以下模板:

<ControlTemplate x:Key="GridSplitterTemplate" TargetType="{x:Type GridSplitter}">
    <!-- What goes here? -->
</ControlTemplate>

这是模板的使用方法:
<GridSplitter Template="{StaticResource GridSplitterTemplate}"
              Grid.Column="1" ResizeDirection="Columns" VerticalAlignment="Stretch" HorizontalAlignment="Center"/>

我还有几个GridSplitter,它们都应该有GridSplitter.Width="10"。我如何使用ControlTemplate一次性设置它?

2个回答

4
如果您想在ControlTemplate中“硬编码”宽度/高度,则只需设置根元素的宽度/高度:
<ControlTemplate x:Key="GridSplitterTemplate" TargetType="{x:Type GridSplitter}">
    <!-- What goes here? -->
    <Grid Width="10" Height="10">
    </Grid>
</ControlTemplate>

我认为@lll说的有道理——这通常是通过样式来完成的。如果您想使用不同大小的GridSplitter实例,将会发生什么呢?而且,使用这种方法并不会损失任何东西:

<Style x:Key="GridSplitterStyle" TargetType="{x:Type GridSplitter}">
    <Setter Property="Width" Value="10" />
    <Setter Property="Height" Value="10" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate x:Key="GridSplitterTemplate" TargetType="{x:Type GridSplitter}">
                <Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
                </Grid>
           </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

现在,只需让您的实例引用样式而不是控件模板:
<GridSplitter Style="{StaticResource GridSplitterStyle}"

这允许您仍然具有默认的高度/宽度为10,但实例可以覆盖它,如果他们需要:

<GridSplitter Style="{StaticResource GridSplitterStyle}" Width=20

还值得一提的是,如果出于组织目的,您不想将控件模板嵌套在样式中,您可以像这样在样式的Setter中引用模板:<Setter Property="Template" Value="{StaticResource GridSplitterTemplate}"/> - HotN

2
你只需要设置 Style,而不是 ControlTemplate
<Style TargetType="GridSplitter" x:Name="GridSplitterTemplate">
    <Setter Property="Width" Value="10"/>/
</Style>

如果您真的想要使用ControlTemplate

<ControlTemplate x:Key="GridSplitterTemplate" TargetType="{x:Type GridSplitter}">
            <GridSplitter Width="10"/>
</ControlTemplate>

我无论如何都无法利用我使用的“ControlTemplate”吗? - Tar
抱歉,我的表述不够清晰。我更新了我的问题 - 我在现有的GridSplitter上使用此模板,因此我不想在GridSplitter的模板内再托管另一个。 - Tar
抱歉,你不理解ControlTemplate的工作原理。这将不会在GridSplitter内部托管另一个GridSplitter。这将覆盖你的Template,所以从技术上讲,你只是定制了它的外观,并创建了一个GridSplitter而已。如果你真的想将宽度设置为10,我强烈建议你研究一下如何使用Styles - 123 456 789 0
好吧,它不起作用...但总的来说,这并不是真的——我在ControlTemplate中托管了几个控件来显示复合控件,效果非常好——我的GridSplitter托管了一个包含许多其他控件的Grid - Tar
我不想使用Style,因为我已经有了模板,所以为什么要使用额外的代码呢? - Tar
我觉得你误解了我的话。既然你不想使用“样式”,并且想要更少的代码,那么让我告诉你,这是行不通的,因为你想要重复使用“ControlTemplate”而不重复设置“Width”为“10”,那么你就必须明确地重新托管它,并使用“GridSplitter”。我不明白为什么你不想使用“样式”。而且,在我的机器上,两种实现方式都可以正常工作。我已经测试过了。 - 123 456 789 0

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