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