C# 交换自定义控件中的ContentPresenter内容

C# 交换自定义控件中的ContentPresenter内容,c#,wpf,xaml,C#,Wpf,Xaml,我有两个ContentPresenterfixedContentPresenter和ResizeableContentPresenter,显然还有一个内容是Generic.xaml。当FixedContent=true时,如何在fixedContentPresenter中将内容设置为仅和内容仅在resizebleContentPresenter中显示 我尝试更改代码中的内容,但内容不显示。 Xaml: 根据FixedContent <Style TargetType={x:Type Con

我有两个ContentPresenter
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;
        }
    }
}