gpt4 book ai didi

c# - 将 ContentControl *放在 * WPF DataTemplate 中?

转载 作者:太空宇宙 更新时间:2023-11-03 14:33:16 24 4
gpt4 key购买 nike

我有一个名为 SpecialExpander 的自定义 Expander 控件.它基本上只是一个标准 Expander带有漂亮的标题和几个属性( HeaderTextIsMarkedRead )。

我首先创建了一个简单的类:

public class SpecialExpander : Expander
{
public string HeaderText { get; set; }
public bool IsMarkedRead { get; set; }
}

然后我创建了一个样式,它在扩展器上设置了几个属性(例如边距、填充等),重要的是,它还定义了自定义 DataTemplate对于 HeaderTemplate属性(property)。该模板基本上是一个有两行的网格。

如下图所示...

  • 对于第一行,我想要一个固定的布局(它总是 TextBlock TextBlock CheckBox )
  • 但是,对于最后一行,我希望能够为每个扩展器提供自定义 XAML。

我试着把 <ContentControl Grid.Row="1" ... />DataTemplate , 但我不知道如何正确连接它。


alt text http://img85.imageshack.us/img85/1194/contentcontrolwithintem.jpg


alt text


问题

我怎样才能构建一个 DataTemplate对于我的 SpecialExpander以便标题具有一些固定内容(顶行)和自定义内容的占位符(底行)?

对于第二个例子,我希望能够做这样的事情:

<SpecialExpander HeaderText="<Expander Header Text>" IsMarkedRead="True">
<SpecialExpander.Header>
<StackPanel Orientation="Horizontal">
<RadioButton Content="High" />
<RadioButton Content="Med" />
<RadioButton Content="Low" />
</StackPanel>
<SpecialExpander.Header>
<Grid>
<Label>Main Content Goes Here</Label>
</Grid>
</SpecialExpander>

最佳答案

今天早上我想到了如何解决这个问题:我不需要构建一个 SpecialExpander,我只需要一个普通的 Expander。然后,对于 header ,我将使用名为 SpecialExpanderHeader 的自定义 ContentControl

这是它的工作原理...

SpecialExpanderHeader 类:

public class SpecialExpanderHeader : ContentControl
{
public string HeaderText { get; set; }
public bool IsMarkedRead { get; set; }
}

SpecialExpanderHeader 样式:

<Style TargetType="custom:SpecialExpanderHeader">
<Setter Property="Padding" Value="10" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="custom:SpecialExpanderHeader">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="5" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal">
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=custom:SpecialExpanderHeader}, Path=HeaderText}" />
<CheckBox Margin="100,0,0,0" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=custom:SpecialExpanderHeader}, Path=IsMarkedRead}" />
</StackPanel>
<Separator Grid.Row="1" />
<ContentPresenter Grid.Row="2" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

扩展器样式

<Style x:Key="Local_ExpanderStyle" TargetType="Expander" BasedOn="{StaticResource {x:Type Expander}}">
<Setter Property="Margin" Value="0,0,0,10" />
<Setter Property="Padding" Value="10" />
<Setter Property="FontSize" Value="12" />
</Style>

用法

<Expander Style="{StaticResource Local_ExpanderStyle}">
<Expander.Header>
<custom:SpecialExpanderHeader IsMarkedRead="True" HeaderText="Test">
<StackPanel Orientation="Horizontal">
<RadioButton Content="High" />
<RadioButton Content="Medium" />
<RadioButton Content="Low" />
</StackPanel>
</custom:SpecialExpanderHeader>
</Expander.Header>
<Grid>
<!-- main expander content goes here -->
</Grid>
</Expander>

关于c# - 将 ContentControl *放在 * WPF DataTemplate 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2099765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com