C# 交换自定义控件中的ContentPresenter内容
我有两个ContentPresenterC# 交换自定义控件中的ContentPresenter内容,c#,wpf,xaml,C#,Wpf,Xaml,我有两个ContentPresenterfixedContentPresenter和ResizeableContentPresenter,显然还有一个内容是Generic.xaml。当FixedContent=true时,如何在fixedContentPresenter中将内容设置为仅和内容仅在resizebleContentPresenter中显示 我尝试更改代码中的内容,但内容不显示。 Xaml: 根据FixedContent <Style TargetType={x:Type Con
fixedContentPresenter
和ResizeableContentPresenter
,显然还有一个内容是Generic.xaml。当FixedContent=true时,如何在fixedContentPresenter
中将内容设置为仅当FixedContent=false时,代码>和内容仅在resizebleContentPresenter
中显示代码>
我尝试更改代码中的内容,但内容不显示。
Xaml:
根据FixedContent
<Style TargetType={x:Type ContentPresenter } x:Key="HideOrShow">
<Style.Triggers>
<DataTrigger Binding="{Binding FixedContent}" Value="False">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
</Style.Triggers>
</Style>
您应该在此处使用ContentControl
,而不是ContentPresenter
当FixedContent
值更改时,Content
变为null,因此没有Animation
相关的副作用
<Grid Background="Purple">
<ContentControl x:Name="fixedContent" Margin="0,75,0,0">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding FixedContent, Mode=OneWay}" Value="false">
<DataTrigger.Setters>
<Setter Property="Content" Value="{StaticResource ContentKey}"/>
</DataTrigger.Setters>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
<Grid Background="Red" Margin="0,54,0,0">
<ContentControl x:Name="resizableContent" Margin="0,75,0,0">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding FixedContent, Mode=OneWay}" Value="true">
<DataTrigger.Setters>
<Setter Property="Content" Value="{StaticResource ContentKey}"/>
</DataTrigger.Setters>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</Grid>
</Grid>
经过一天的努力,我终于找到了一个比@OmegaMan提出的更好的答案,希望它能帮助其他人。这是新的XAML(向两个ContentPresenter
添加了Content=“{x:Null}”
):
您可以向我们展示您尝试的代码吗?您可以使用ContentControl并适当地绑定其内容属性。如果这一切都在ControlTemplate或DataTemplate中,您可以在模板级别使用触发器来完成。触发器很有趣,现在显示或隐藏是我想要的,我需要在两个contentpresenter之间交换内容。。。通过怎么样code@HishamMaudarbocus如果在两个视图中显示相同的内容,并且一个可见,而另一个不可见,则具有与交换相同的效果。在WPF中,这可能是最常见的产生“交换”效果的方法。如果我们使用您推荐的方案,资源使用情况是否相同?@HishamMaudarbocus您需要确定资源使用是否不利,但在大多数情况下,它应该是好的。@OmegaMan i对您的回答进行了一些修改,并且它起到了作用,然而,我有点担心资源的使用。如果内容是使用重动画的控件,会发生什么情况?会不会因为它出现在两个内容演示器中而渲染两次?完全错误!!!看看我的答案。首先,您不应该在这里使用ContentPresenter
,其次,您不应该在setter中放置任何类型的代码。如果要在该属性的值更改时执行更多操作,该怎么办?最好是使用属性ChangedCallback
,但是从那里访问任何控件也会很糟糕。我回到电脑后会尝试一下你的答案,无论如何我认为静态资源不适合这里,内容可能随时会变。具体情况取决于实际情况,您在问题中没有提到这一点。将代码放入getter或setter中并没有错。在我所从事的所有C#项目中,我100%都是这样做的。现在,是否使用属性ChangedCallback
是一个不同的问题。@OmegaMan无论如何,这是一个糟糕的做法。我喜欢你的答案,我认为这说明了你提到的资源分配问题,但我相信你有逻辑来处理固定内容
布尔值的反转。不是按这个顺序错/对,而是真/错。
<Grid Background="Purple">
<ContentControl x:Name="fixedContent" Margin="0,75,0,0">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding FixedContent, Mode=OneWay}" Value="false">
<DataTrigger.Setters>
<Setter Property="Content" Value="{StaticResource ContentKey}"/>
</DataTrigger.Setters>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
<Grid Background="Red" Margin="0,54,0,0">
<ContentControl x:Name="resizableContent" Margin="0,75,0,0">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding FixedContent, Mode=OneWay}" Value="true">
<DataTrigger.Setters>
<Setter Property="Content" Value="{StaticResource ContentKey}"/>
</DataTrigger.Setters>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</Grid>
</Grid>
<Grid>
<ContentPresenter x:Name="fixedContent" Content="{x:Null}"/>
<Grid>
<ContentPresenter x:Name="resizableContent" Content="{x:Null}"/>
</Grid>
</Grid>
public bool FixedContent
{
get { return (bool)GetValue(FixedContentProperty); }
set
{
SetValue(FixedContentProperty, value);
if (value) // Is Fixed
{
ResizableContentPresenter.Content = null;
FixedContentPresenter.Content = Content;
}
else
{
FixedContentPresenter.Content = null;
ResizableContentPresenter.Content = Content;
}
}
}