我不确定何时应该使用ContentPresenter而不是ContentControl(反之亦然).目前,我ContentControl几乎一直在使用我DataTemplate的.何时会ContentPresenter是更好的选择?为什么?
我认为这是可能的,但显而易见的方法是行不通的.
目前,我这样做:
<ContentControl
Content="{Binding HurfView.EditedPart}">
<ContentControl.Resources>
<Style
TargetType="ContentControl"
x:Key="emptytemplate">
<Style.Triggers>
<DataTrigger
Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content}"
Value="{x:Null}">
<Setter
Property="ContentControl.Template">
<Setter.Value>
<ControlTemplate>
<Grid
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
<TextBlock>EMPTY!</TextBlock>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Resources>
</ContentControl>
Run Code Online (Sandbox Code Playgroud)
我没有得到任何绑定错误,这编译.但是,它不会产生预期的结果.我也试过了这个显而易见的事情:
<DataTemplate DataType="{x:Null}"><TextBlock>Hurf</TextBlock></DataTemplate>
Run Code Online (Sandbox Code Playgroud)
这不会编译.并且尝试两次设置内容也会失败:
<ContentControl
Content="{Binding HurfView.EditedPart}">
<TextBlock>DEFAULT DISPLAY</TextBlock>
</ContentControl>
Run Code Online (Sandbox Code Playgroud)
我可以不编写自定义模板选择器吗?
我在XAML中有这个
<ControlTemplate TargetType="{x:Type Button}">
<Image ...>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
我希望在C#代码中实现相同的功能.我怎样才能做到这一点?
ControlTemplate ct = new ControlTemplate();..
Image img = new Image();..
Run Code Online (Sandbox Code Playgroud)
现在如何将此图像分配给控制模板?我们能做到这一点还是我错过了这里的概念?
ContentControl.Template和ContentControl.ContentTemplate有什么区别?我何时使用哪个?
例如,我可以在WPF的xaml文件中写入:
<ContentControl>
<ContentControl.Template>
<ControlTemplate>
<Label Content="This is from the Template"/>
</ControlTemplate>
</ContentControl.Template>
</ContentControl>
Run Code Online (Sandbox Code Playgroud)
注意ContentControl.模板标签
或者我可以这样写:
<ContentControl>
<ContentControl.ContentTemplate>
<DataTemplate>
<Label Content="This is From the ContentTemplate"/>
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
Run Code Online (Sandbox Code Playgroud)
注意ContentControl.ContentTemplate标签
输出看起来相同,在第一种情况下,我使用ControlTemplate,在另一种情况下使用DataTemplate.但是,如果我必须使用.Template或.ContentTemplate,我应该怎么做?这有什么影响(例如DataBinding,Property Inheritance,...).
我目前正在尝试通过使用ListView(作为选项卡)和带有绑定内容属性的ContentControl来实现带有隐藏选项卡的tabcontrol的功能.
我读了一下这个主题,如果我做对了,它应该这样工作:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20.0*"/>
<ColumnDefinition Width="80.0*"/>
</Grid.ColumnDefinitions>
<ListBox Grid.Column="0">
<ListBoxItem Content="Appearance"/>
</ListBox>
<ContentControl Content="{Binding SettingsPage}" Grid.Column="1"/>
</Grid>
.
.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ContentControl x:Key="AppearancePage">
<TextBlock Text="Test" />
</ContentControl>
<ContentControl x:Key="AdvancedPage">
<TextBlock Text="Test2" />
</ContentControl>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
并在代码背后:
public partial class MainWindow : MetroWindow
{
private ContentControl SettingsPage;
private ResourceDictionary SettingsPagesDict = new ResourceDictionary();
public MainWindow()
{
InitializeComponent();
SettingsPagesDict.Source = new Uri("SettingsPages.xaml", UriKind.RelativeOrAbsolute);
SettingsPage = SettingsPagesDict["AppearancePage"] as ContentControl;
Run Code Online (Sandbox Code Playgroud)
尽管它没有抛出任何错误,但它不会显示"Test"TextBlock.
我可能有错误的绑定概念,请给我一个正确方向的提示.
问候
我有以下简化示例:
<Window x:Class="TemplateBinding.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary
Source="pack://application:,,,/TemplateBinding;component/PersonTemplate.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<ContentControl ContentTemplate="{StaticResource PersonTemplate}" />
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
附:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DataTemplate x:Key="PersonTemplate">
<Border Width="100" Height="100" Background="RosyBrown">
<TextBlock Text="{Binding Path=FirstName}" VerticalAlignment="Center" TextAlignment="Center"/>
</Border>
</DataTemplate>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
作为我的DataTemplate在一个单独的ResourceDictionary文件中.
我在我的MainWindow的Construcor中设置了我的DataContext,并通过显示如下的第一个名称来验证它:<ContentControl Grid.Row="1" Content="{Binding FirstName}"/>.
在另一个场景中,我使用DataTemplate与我在DataTemplate中以ListBox完全相同的方式进行绑定,它只是起作用.
我知道DataTemplate除了绑定之外正在工作,因为它正确显示了大小和背景颜色.
我究竟做错了什么?我的DataTemplate中的绑定如何看?
data-binding wpf datatemplate resourcedictionary contentcontrol
我将ContentControl.DataTemplateSelector设置为我想要的.
我希望根据命令或其他任何东西,调用ContentControl以通过xaml或代码从选择器重新选择模板.
谢谢
我有一个ContentControl的样式,我想在我目前有边框的地方使用它.当我使用它时,子控件不会伸展到填充,只占用少量空间.我已经尝试将HorizontalAlignment ="Stretch"应用于所有内容,但它不起作用.怎么了?
<Style x:Key="GradientPanel" TargetType="ContentControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<Grid HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
<Rectangle RadiusY="10" RadiusX="10" Stroke="Black" StrokeThickness="0">
<Rectangle.Effect>
<DropShadowEffect Opacity="0.56" ShadowDepth="1" BlurRadius="3" />
</Rectangle.Effect>
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFE1EAF3"/>
<GradientStop Color="White" Offset="1"/>
<GradientStop Color="#FFFAFBFD" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<ContentPresenter Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
...
之前(工作正常):
<Border Style="{StaticResource SearchContainerBorder}" >
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ToggleButton Style="{StaticResource ToggleButtonExpanderStyle}" Grid.Row="0" Grid.Column="1" Height="25" Width ="25" HorizontalAlignment="Center" …Run Code Online (Sandbox Code Playgroud) 任何人都可以告诉我为什么这会崩溃我的应用程序?似乎有一些无休止的递归,我无法弄清楚为什么.我得到了这个例外
遍历树时超出了逻辑树深度.这可能表明树中有一个循环
<ContentControl Content="{Binding}">
<ContentControl.ContentTemplate>
<DataTemplate>
<Button Content="{Binding MyString}"/>
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
Run Code Online (Sandbox Code Playgroud)
这就是我所拥有的所有资源
public MainWindow()
{
InitializeComponent();
MyString = "Test";
this.DataContext = this;
}
public string MyString { get; set; }
Run Code Online (Sandbox Code Playgroud) 我需要绑定一个TextBox符合两个标准:
当user.IsEnabled从数据源中提取出来.我想知道是否有人有一个简单的方法来做到这一点.
这是XAML:
<ContentControl IsEnabled="{Binding Path=Enabled, Source={StaticResource UserInfo}}">
<TextBox DataContext="{DynamicResource UserInfo}" Text="{Binding FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding Path=Text, RelativeSource={RelativeSource Self}, Converter={StaticResource LengthToBool}}"/>
</ContentControl>
Run Code Online (Sandbox Code Playgroud) contentcontrol ×10
wpf ×9
xaml ×5
c# ×3
datatemplate ×3
.net ×2
binding ×2
data-binding ×1
isenabled ×1
silverlight ×1
textbox ×1