- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个 WPF 自定义控件,一个 Button
与 Image
和 Text
.我在控件中添加了两个依赖属性 ImagePath
和 Text
,并且控件模板(在 Themes\Generic.xaml 中)是一个简单的堆栈面板,可以水平排列图像和文本。Text
属性工作正常。但是由于某种原因,当我使用 TemplateBinding
时,我的测试项目中的示例图像没有出现到ImagePath
依赖属性来获取它的路径。我已经通过临时替换 TemplateBinding
来测试图像在带有图像路径的自定义控件中,在这种情况下它会出现。
我希望在这方面有更多经验的人可以看看并告诉我为什么控件没有按预期工作。谢谢你的帮助。
我的 VS 2008 解决方案包含一个项目 CustomControlDemo。该项目包含一个自定义控件 TaskButton.cs 和一个用于测试该控件的主窗口 Window1.xaml。我的测试图像 calendar.png 位于项目根级别的 Resources 文件夹中,Generic.xaml 位于项目根级别的 Themes 文件夹中。
这是我的自定义控件的代码(来自 TaskButton.cs):
using System.Windows;
using System.Windows.Controls;
namespace CustomControlDemo
{
public class TaskButton : RadioButton
{
#region Fields
// Dependency property backing variables
public static readonly DependencyProperty ImagePathProperty;
public static readonly DependencyProperty TextProperty;
#endregion
#region Constructors
/// <summary>
/// Default constructor.
/// </summary>
static TaskButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(TaskButton), new FrameworkPropertyMetadata(typeof(TaskButton)));
// Initialize ImagePath dependency properties
ImagePathProperty = DependencyProperty.Register("ImagePath", typeof(string), typeof(TaskButton), new UIPropertyMetadata(null));
TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(TaskButton), new UIPropertyMetadata(null));
}
#endregion
#region Dependency Property Wrappers
/// <summary>
/// The ImagePath dependency property.
/// </summary>
public string ImagePath
{
get { return (string)GetValue(ImagePathProperty); }
set { SetValue(ImagePathProperty, value); }
}
/// <summary>
/// The Text dependency property.
/// </summary>
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
#endregion
}
}
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomControlDemo">
<Style TargetType="{x:Type local:TaskButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:TaskButton}">
<StackPanel Height="Auto" Orientation="Horizontal">
<Image Source="{TemplateBinding ImagePath}" Width="24" Height="24" Stretch="Fill"/>
<TextBlock Text="{TemplateBinding Text}" HorizontalAlignment="Left" Foreground="{DynamicResource TaskButtonTextBrush}" FontWeight="Bold" Margin="5,0,0,0" VerticalAlignment="Center" FontSize="12" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
<Window x:Class="CustomControlDemo.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:customControl="clr-namespace:CustomControlDemo"
Title="Window1" Height="300" Width="300">
<Grid>
<customControl:TaskButton ImagePath="Resources\calendar.png" Text="Calendar" />
</Grid>
</Window>
最佳答案
我将把 cwap 的答案作为接受的答案,因为它在技术上是正确的。然而,事实证明有一种更简单的方法可以解决这个问题。
TemplateBindings 不是一流的 Binding 对象。它们被设计为轻量级的,因此它们是单向的,并且它们缺少其他 Binding 对象的某些功能。最值得注意的是,它们不支持与目标关联的已知类型转换器。见麦克唐纳, C# 2008 中的专业 WPF ,页。 872. 这就是为什么 cwap 正确响应我可能需要创建一个类型转换器并在我的自定义按钮的控件模板中专门引用它的原因。
但我不必使用 TemplateBinding 将控件模板绑定(bind)到自定义控件的 ImagePath 属性。我可以使用普通的旧 Binding 对象。这是我的自定义控件模板的修订标记:
<!-- Task Button Default Control Template-->
<Style TargetType="{x:Type local:TaskButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:TaskButton}">
<StackPanel Height="Auto" Orientation="Horizontal">
<Image Source="{Binding Path=ImagePath, RelativeSource={RelativeSource TemplatedParent}}" Width="24" Height="24" Stretch="Fill" Margin="10,0,0,0" />
<TextBlock Text="{TemplateBinding Text}" HorizontalAlignment="Left" Foreground="{TemplateBinding Foreground}" FontWeight="Bold" Margin="5,0,10,0" VerticalAlignment="Center" FontSize="12" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
关于WPF 自定义控件 : TemplateBinding to Image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1935919/
我是 WPF 的新手,我正在努力寻找我正在尝试做的事情的解决方案,因为我仍然有点不确定我是否正确地做这件事。 我为按钮定义了以下样式
好的,所以我有一个包含以下资源的窗口
我有一个列表框,其项目模板是一个列表框。我正在尝试将内部列表框的“前景”属性设置为与主列表框的相同。这是失败的。以下是代码片段。在这里 Foreground="{TemplateBinding For
自定义控件(在 VS 2008 下编写)具有 SelectedColor 依赖属性,其控件模板包含以下内容: ... ... 除非将绑定(bind)替换为: ...
我有一个名为 EnhancedTextBox 的自定义控件,它是一个具有 TextBox 和 Button 的 UserControl。对于消费者来说,我希望它看起来像一个文本框,所以我做了以下事情:
我正在创建一个 WPF 自定义控件,一个 Button与 Image和 Text .我在控件中添加了两个依赖属性 ImagePath和 Text ,并且控件模板(在 Themes\Generic.xa
这 2 个绑定(bind)之间的区别是什么: 和 ? 最佳答案 TemplateBinding 并不完全相同。 MSDN 文档通常是
我正在尝试制作自己的控件版本,例如 TextBox ,我想向其中添加一些自定义 UI。我想从这个类继承,这样用户仍然可以像调用普通文本框一样调用我的特殊文本框。我有以下内容: // MySpecial
我只是在silverlight 中处理自定义控件,而在我的一生中,我无法让TemplateBindings 工作。有人可以给这个简化版本一次,看看我是否遗漏了什么。 所以我在 generic.xaml
想象一个名为 Testko 的控件,如下所示: public class Testko: Control { public static readonly Dependency
我是创建 UserControl 的新人,现在我正在尝试自定义 UserControl 模板,如下所示:
我正在创建 模板化控件 在我的通用 Windows 应用程序中。 问题是在 TemplateBinding不起作用。 似乎问题在于它是在 DataTemplate 中定义的。 . 这是Style并将
我想在 XAML 字典中的 Border 上使用 RoutedEvent。 RoutedEvent 来自模板所在的类,我该如何实现? ModernWindow.cs /// /// Gets fir
在我的 Silverlight 3 应用程序中,我创建了一个自定义工具提示,它会在鼠标悬停在饼图的一部分上时显示。显示的值通过 TemplateBinding 设置:
Polymer’s TemplateBinding library extends the capabilities of the HTML Template Element by enabling
目前,我正在开发一个简单的自定义按钮,它使用用户提供的图像作为按下和正常状态的背景。我有很多按钮,所以我决定编写一个自定义按钮并为按下和正常状态的图片实现两个属性。 这是我正在使用的代码 public
这就是我在 WPF 中重现这个问题的方式: 创建自定义控件: public class TestCustomControl : Control { static TestCustomControl()
我正在构建一个按钮样式,该样式依赖于将颜色画笔转换为较暗的阴影来创建阴影。在常规 XAML 中,我有一个转换器,而不是我在完美工作的绑定(bind)上使用的转换器: BorderBrush="{Bin
为什么下面的 XAML 给我一个 XamlParseException 和(无意义的)消息“表达式类型不是有效的样式值”。在运行时?
我正在 WPF 中制作自定义控件。我仍在学习 TemplateBinding 的详细信息(在自定义控件中大量使用)。 我注意到我似乎无法在 MulitBinding 内部使用 TemplateBind
我是一名优秀的程序员,十分优秀!