C# 带有ContentControl的WPF自定义切换按钮

C# 带有ContentControl的WPF自定义切换按钮,c#,wpf,C#,Wpf,似乎很难在WPF中实现一些相当琐碎的事情 我需要设计一个具有特定外观(和感觉)的切换按钮。我做了一个小项目来演示这个问题 “ToggleButton用户控件”: 我希望使用控件的方式: <local:UserControl1> <TextBlock>Whatever</TextBlock> </local:UserControl1> 无论什么 当我运行程序时,文本框显示为“Whatever”,但没有应用样式,椭圆不会显示 正确的做法是

似乎很难在WPF中实现一些相当琐碎的事情

我需要设计一个具有特定外观(和感觉)的切换按钮。我做了一个小项目来演示这个问题

“ToggleButton用户控件”:

我希望使用控件的方式:

<local:UserControl1>
    <TextBlock>Whatever</TextBlock>
</local:UserControl1>

无论什么
当我运行程序时,文本框显示为“Whatever”,但没有应用样式,椭圆不会显示

正确的做法是什么

==更新===

好吧,去某个地方。。。最后

现在我把它作为用户控件:

<UserControl x:Class="WpfApp4.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:wpfApp4="clr-namespace:WpfApp4"
             mc:Ignorable="d"  d:DesignHeight="450" d:DesignWidth="800"
             Name="Bla">
    <UserControl.Resources>
        <Style TargetType="wpfApp4:UserControl1">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <ToggleButton>
                            <Grid>
                                <Ellipse Width="300" Height="300" Fill="Yellow"/>
                                <ContentPresenter Content="{Binding ElementName=Bla, Path=MainContent}" />
                            </Grid>
                        </ToggleButton>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>

        <ContentPresenter/>
</UserControl>

我就是这样使用它的:

<local:UserControl1>
    <local:UserControl1.MainContent>
        <TextBlock>Whatever</TextBlock>
    </local:UserControl1.MainContent>
</local:UserControl1>

无论什么
这最后给了我一个应用样式的切换按钮(椭圆显示),文本框也显示出来

所以,这是可行的。你是说应该这样做吗?或者可以简化吗?

它应该更像

<local:UserControl1>
    <local:UserControl1.MainContent>
        <TextBlock>Whatever</TextBlock>
    </local:UserControl1.MainContent>
</local:UserControl1>

无论什么
但您应该期待覆盖ContentControl,这比使用UserControl更合适

顺便问一下,你为什么在ToggleButton里面放一个ContentControl?ToggleButton本身是一个ContentControl,它有自己的内容属性

更新:

一切都取决于你不想做什么。如果只是更改切换按钮的视觉效果,则只需创建如下切换按钮样式:

<ToggleButton>

    <TextBlock>Whatever</TextBlock>

    <ToggleButton.Style>
        <Style TargetType="{x:Type ToggleButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                        <Grid>
                            <Ellipse Width="300" Height="300" Fill="Yellow"/>
                            <ContentPresenter Content="{TemplateBinding Content}" />
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ToggleButton.Style>
</ToggleButton>

无论什么
当然,如果您想在整个应用程序中使用样式,最好在资源字典中定义样式(例如在App.xaml中),给它一个键,并使用
{StaticResource key}
在每个切换按钮上调用它


另一方面,如果您想添加一些逻辑,则必须创建一个继承自ToggleButton的控件类,并在其中添加逻辑。

我终于有进展了,谢谢您。我用你输入的信息更新了问题。这就是你的意思吗?还是可以进一步简化?再次使用Thx,因为这真的开始令人沮丧!
<local:UserControl1>
    <local:UserControl1.MainContent>
        <TextBlock>Whatever</TextBlock>
    </local:UserControl1.MainContent>
</local:UserControl1>
<ToggleButton>

    <TextBlock>Whatever</TextBlock>

    <ToggleButton.Style>
        <Style TargetType="{x:Type ToggleButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                        <Grid>
                            <Ellipse Width="300" Height="300" Fill="Yellow"/>
                            <ContentPresenter Content="{TemplateBinding Content}" />
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ToggleButton.Style>
</ToggleButton>