我有一个带有触发器部分的文本框的控件模板,如下所示
<ControlTemplate.Triggers>
<EventTrigger RoutedEvent="Binding.TargetUpdated">
<BeginStoryboard>
<Storyboard>
<ColorAnimationUsingKeyFrames
Storyboard.TargetName="Border"
Storyboard.TargetProperty="Background.(SolidColorBrush.Color)">
<EasingColorKeyFrame KeyTime="0:0:0.20" Value="Yellow"/>
<EasingColorKeyFrame KeyTime="0:0:1" Value="{Binding ElementName=Border, Path=Background.SolidColorBrush.Color}"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ControlTemplate.Triggers>
Run Code Online (Sandbox Code Playgroud)
这个想法是,每当绑定目标更新时,文本框就会发出黄色脉冲。我的用户界面在控件之间具有复杂的依赖关系,我希望当事情发生变化时通过简单的视觉提示通知用户。
我上面遇到的问题是将文本框的背景颜色重置为之前的颜色。如果我将其动画恢复为白色,这可能不是原始颜色。有几种视觉状态,即normal disabled enabled。
所以我希望脉冲黄色,然后恢复到之前的颜色。但是,如果我尝试绑定最终关键帧的颜色,则会收到类似错误
Cannot freeze storyboard to be used across multiple threads.
Run Code Online (Sandbox Code Playgroud)
有没有办法在动画完成后自动清除动画结果或动态绑定正确的颜色?
我想将 WPF 中的勾号颜色CheckBox从黑色更改为白色。我尝试在CheckBox声明中这样做:
<CheckBox Background="black" Foreground="White" BorderBrush="#262626"/>
Run Code Online (Sandbox Code Playgroud)
背景和边框成功更改,但刻度线本身没有更改。
假设我已经定义了一个带圆角的按钮.
<Style x:Key="RoundButton" TargetType="Button">
<!-- bla bla -->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border CornerRadius="0,5,5,0" />
<!-- bla bla -->
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
我可能这个按钮的用户可以指定CornerRadius吗?我可以使用TemplateBinding吗?但是我应该在哪里绑定?(标记?)
有人可以详细说明ControlTemplate和DataTemplatewpf 之间的区别吗?
在自定义控件的情况下应该使用什么?比如一个StackPanel可能有一个image和一个TextBox?
在某些使用"Content"属性定义自定义控件的情况下,这似乎令人困惑.
如果能够提供如何在不同场景中使用每个场景的示例,那将是很好的.
我正在向滑块添加附加行为,这会导致在拖动拇指并将其保持在特定区域时滚动某些内容.(不能使用简单的IsMouseOver触发器,因为Slider Thumb具有MouseCapture.)
该行为有3个属性:
#region IsScrollHoverProperty
public static readonly DependencyProperty IsScrollHoverProperty = DependencyProperty.RegisterAttached(
"IsScrollHover",
typeof(Boolean),
typeof(ScrollHoverAreaBehaviour),
new UIPropertyMetadata(false));
#endregion
#region ScrollLeftRectProperty
public static readonly DependencyProperty ScrollLeftRectProperty = DependencyProperty.RegisterAttached(
"ScrollLeftRect",
typeof(Rectangle),
typeof(ScrollHoverAreaBehaviour),
new UIPropertyMetadata(null));
#endregion
#region ScrollRightRectProperty
public static readonly DependencyProperty ScrollRightRectProperty = DependencyProperty.RegisterAttached(
"ScrollRightRect",
typeof(Rectangle),
typeof(ScrollHoverAreaBehaviour),
new UIPropertyMetadata(null));
#endregion
Run Code Online (Sandbox Code Playgroud)
当用户拖动滑块时,IsScrollHoverProperty被设置为true,这一切都在Slider的ControlTemplates.Triggers中完成,并且可以正常工作.
当它设置为true时,回调将把PreviewMouseEnterHandlers挂钩到两个Rectangle中以检测鼠标何时进入它们.
有问题的矩形也在Slider的controltemplate中定义:
<StackPanel Grid.Row="0" Grid.RowSpan="3" HorizontalAlignment="Left" Orientation="Horizontal">
<Rectangle Width="40" Fill="#AAAAAAAA" Name="ScrollLeftRect"/>
</StackPanel>
<StackPanel Grid.Row="0" Grid.RowSpan="3" HorizontalAlignment="Right" Orientation="Horizontal">
<Rectangle Width="40" Fill="#AAAAAAAA" Name="ScrollRightRect"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是将这些矩形绑定到附加的ScrollRightRect和ScrollLeftRect属性.我尝试了一些事情,并怀疑我犯了一个愚蠢的绑定错误,或者我试图做一些不允许的事情.我目前正在controltemplate.triggers中绑定它们,如下所示:
<Trigger Property="local:ScrollHoverAreaBehaviour.IsScrollHover" Value="False">
<Setter Property="local:ScrollHoverAreaBehaviour.ScrollLeftRect" Value="{Binding ElementName=ScrollLeftRect}"/>
<Setter …Run Code Online (Sandbox Code Playgroud) 我为ToggleButton创建了一个ContentTemplate和Style,它看起来就像你从微软的WebMatrix那里知道的那样.
但是,并不总是可以单击,也不会显示悬停效果.我发现当我将鼠标悬停在图标或按钮文本上时,会出现点击/悬停区域.


一旦盘旋,可以用鼠标回到右边,悬停不会消失(应该如此).
这是代码的重要部分:
<StackPanel.Resources>
<Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource NavigationButton}" />
</StackPanel.Resources>
<ToggleButton x:Name="_btn_Buchungen" Click="_btn_Buchungen_Click">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Image Source="{StaticResource Buchungen}" Width="16" Height="16" />
<TextBlock Text="Buchungen" />
</StackPanel>
</ToggleButton>
Run Code Online (Sandbox Code Playgroud)
ControlTemplate和样式:
<Style TargetType="{x:Type ToggleButton}" x:Key="NavigationButton">
<Setter Property="Background" Value="{x:Null}" />
<Setter Property="Height" Value="35" />
<Setter Property="BorderBrush" Value="{x:Null}" />
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Border Name="OuterBorder" BorderThickness="0,1,0,0" >
<Border Name="InnerBorder" BorderThickness="0,1,0,1" >
<ContentPresenter HorizontalAlignment="Left" VerticalAlignment="Center"/>
</Border>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Style" TargetName="InnerBorder" Value="{StaticResource ButtonInnerBHover}" /> …Run Code Online (Sandbox Code Playgroud) 我遇到了一些关于我的C#/ XAML Metro-UI应用程序的视觉外观的问题.我想自定义默认模板.对于其他类型的应用程序,我可以从MSDN文章中获取默认样式和控件.例如:
在哪里可以找到类似于Metro-UI默认样式和模板的内容?
我知道可以在Expression Blend中提取模板或样式.但是我在下一个帖子中描述了我的Blend for Visual Studio 11的问题.
我想(重新)模板控件,例如ComboBox.
XAML:
<ComboBox Style="{StaticResource MyComboBoxStyle}" ... >
<!-- ... -->
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
在ControlTemplate中我想要一个Button.
ResourceDictionary中:
<Style x:Key="MyComboBoxStyle" TargetType="{x:Type ComboBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBox}">
<Grid>
<!-- ... -->
<Button Command="{TemplateBinding Tag}" CommandParameter="{Binding ???}" />
<!-- ... -->
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
但我想设置CommandParameter应用模板的Control(在本例中为ComboBox).
我怎么解决这个问题?
我正在尝试简化一些代码并提高可维护性.
我最初正在寻找一种方法,让文本框与左边对齐,可以缩小并扩展到最大值,而不会在达到最大值后在网格单元内居中.
所以我开始写这样的代码......
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
</Grid.ColumnDefinitions>
<TextBox Text="Some text"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
Margin="10"
MaxWidth="150" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
(代码清单1)
这会产生类似这样的东西......

(图1)
如您所见,这将TextBox的最大宽度居中,但它在网格单元的中心对齐.
那么我可能,如果我改变了文本框的水平对齐方式,那么...
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
</Grid.ColumnDefinitions>
<TextBox Text="Some text"
VerticalAlignment="Center"
HorizontalAlignment="Left"
Margin="10"
MaxWidth="100" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
(代码清单2)
但不幸的是,这只会产生这样的东西......

(图2)
同样,这是不正确的,因为尽管右侧有所有空白区域,但文本框并没有像我想要的那样扩展到其最大宽度100.
最后,我发现如果将TextBox放在嵌套网格中,您将获得所需的效果.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
</Grid.ColumnDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"
MaxWidth="120" />
<ColumnDefinition Width="0*" />
</Grid.ColumnDefinitions>
<TextBox Text="Some text"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
Margin="10"
MaxWidth="100" />
</Grid>
</Grid>
Run Code Online (Sandbox Code Playgroud)
(代码3)
这产生了这个......

(图3)
如您所见,嵌套网格填充整个200宽的空间,但文本框填充左侧100,并留下右侧的空白区域.(如果此窗口具有可调整大小,则会缩小并适当扩展)
我想将代码清单3的方法应用于样式或控件模板,因此我可以将其应用于适用于此情况的TextBoxes.
在一个完美的场景中,我会做...
<TextBox Text="Some text" …Run Code Online (Sandbox Code Playgroud) 我想用一个ComboBox不同的CornerRadius,我怎么能简单地改变它?我试着Style和ControlTemplate,但没有成功.
controltemplate ×10
wpf ×9
xaml ×5
c# ×4
binding ×2
styles ×2
.net ×1
.net-4.0 ×1
combobox ×1
controls ×1
cornerradius ×1
datatemplate ×1
triggers ×1
windows-8 ×1