【发布时间】:2012-03-26 05:04:05
【问题描述】:
我正在尝试制作一个包含几个按钮和几个标签的自定义控件,但这些按钮应该是不可见的,只显示其中的内容。我可以通过将它们设置为透明来摆脱边框、背景等。但是每当我将鼠标悬停在它们上方时,默认的窗口悬停效果都会再次显示整个按钮。我已经尝试了许多关于自定义控件的指南,但最终无法弄清楚如何覆盖它。基本上我的问题归结为,有多少可以放在 generic.xaml 文件中,我必须在该文件中使用什么组织,以及这些样式应该去的其他地方吗?我确实意识到这是一个非常基本的问题,但这只是让我发疯,无法找出具体的答案。谢谢!
当前 xaml:
<Style TargetType="{x:Type local:TimePicker}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:TimePicker}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Height="{TemplateBinding Height}"
Width="{TemplateBinding Width}">
<StackPanel Orientation="Horizontal">
<StackPanel x:Name="PART_Root"
Orientation="Horizontal"
HorizontalAlignment="Center">
<ToggleButton x:Name="PART_HourButton"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="0"
Background="Transparent"
BorderBrush="Transparent"
BorderThickness="0"
Height="{Binding ElementName=PART_IncDecPanel, Path=ActualHeight}"
Width="{Binding ElementName=PART_HourButton, Path=ActualHeight}"
Content="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Hour}">
<ToggleButton.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Transparent" />
</Trigger>
</ToggleButton.Triggers>
</ToggleButton>
<Label x:Name="PART_HourMinSeparator"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="0"
Content=":" />
<ToggleButton x:Name="PART_MinButton"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="0"
Background="Transparent"
BorderBrush="Transparent"
BorderThickness="0"
Height="{Binding ElementName=PART_HourButton, Path=ActualHeight}"
Width="{Binding ElementName=PART_HourButton, Path=ActualWidth}"
Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Minute}" />
<StackPanel x:Name="PART_IncDecPanel" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button x:Name="PART_IncreaseTime"
Background="Transparent"
BorderBrush="Transparent"
BorderThickness="0"
HorizontalAlignment="Center"
HorizontalContentAlignment="Center"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
Margin="0"
Padding="0"
Width="22"
Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IncreaseImage.ActualHeight}">
<Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IncreaseImage}" />
</Button>
<Button x:Name="PART_DecreaseTime"
Background="Transparent"
BorderBrush="Transparent"
BorderThickness="0"
HorizontalContentAlignment="Center"
HorizontalAlignment="Center"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
Margin="0"
Padding="0"
Height="{Binding ElementName=PART_IncreaseTime, Path=ActualHeight}"
Width="{Binding ElementName=PART_IncreaseTime, Path=ActualWidth}">
<Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DecreaseImage}" />
</Button>
</StackPanel>
</StackPanel>
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
【问题讨论】:
-
如果您想要的按钮看起来不像按钮,并且当您将鼠标悬停在它们上时不会像按钮一样反应,那么您确定您真的想要按钮吗?但是对于您的问题,您将需要替换几乎整个按钮的默认模板。
-
我是否在 generic.xaml 中这样做?我会在 ToggleButton 大纲中还是在其他地方这样做?
-
与您的用户控制差不多。为您的 ToggleButton 设置样式。在那种风格中,使用 setter 来设置模板。在模板中只包含 ContentPresenter(如 flq 建议的那样),您最终会得到一个没有自己呈现的按钮。请记住,如果您决定保留模板的某些部分而不是全部(可能是选中时外观的变化),则必须在自己的模板中重新实现。
标签: wpf triggers styles custom-controls storyboard