【问题标题】:wpf control templatewpf 控件模板
【发布时间】:2009-07-17 14:38:57
【问题描述】:

我有一个非常简单的案例,我认为使用模板会受益(但我不确定,这就是我要问的原因)。我见过的所有模板示例要么假设比我拥有更多的知识,要么太具体以至于对像我这样的新手没有太大用处,要么包含许多辅助内容,难以识别模板的一部分。

设置如下: 我有两个并排的标签,第一个标签填充了字段的名称,第二个标签填充了字段的值。

这是我目前在我的应用程序中拥有的 XAML(很多次):

<StackPanel Style="{StaticResource horizontalStackerStyle}">
    <Label Style="{StaticResource labelStyle}">Field One:</Label>
    <Label Style="{StaticResource valueStyle}" Name="field1" 
        Content="{Binding dataObject.field1}" />
</StackPanel>

我想创建一个模板,这样我就可以像这样编写 XAML:

<CustomControlOrWhatever 
    FieldName="Field One:" 
    FieldValue="{Binding dataObject.field1}"/>

我觉得我可以使用某种模板来做到这一点。这样做的一个好处是我不需要一遍又一遍地指定样式。我对么?我该怎么做?

提前致谢!

更新:

仍然没有找到答案。我选择了使用依赖属性的可能解决方案,并尝试询问clarifying question here。嗯,第一响应者说我实际上不需要用 DP 废话把我的代码弄得乱七八糟,所以我再次更改了它——它仍然不起作用。任何人都可以提出一个可行的解决方案吗?这看起来应该很简单。

要明确一点:这只需要单向绑定,值每隔几秒更新一次。

【问题讨论】:

  • 如果你不介意我问,既然你问了一个单独的问题,为什么要取消标记这个?
  • 因为我是个新手,对这个系统的经验很少。我假设您检查了对您最有帮助的答案,或者最能回答问题的答案。简而言之:我无法让您的解决方案发挥作用。由于我无法知道问题是出在您的解决方案上还是(更有可能)出在我的实现上,所以我选择取消选中它。

标签: wpf templates controls controltemplate


【解决方案1】:

您要求的基本上是用户控件。

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SomeNameSpace.SomeControlName">
    <Grid x:Name="LayoutRoot">
     <StackPanel Style="{StaticResource horizontalStackerStyle}">
      <Label Style="{StaticResource labelStyle}" x:Name="FieldNameLbl"></Label>
      <Label Style="{StaticResource valueStyle}" x:Name="ValueLbl">
      </StackPanel>
    </Grid>
</UserControl>

在后面的代码中,您需要公开两个设置控件值的属性。

public string FieldName
{
    get { return FieldNameLbl.Text; }
    set { FieldNameLbl.Text = value; }
}

public string FieldValue
{
    get { return ValueLbl.Text; }
    set { ValueLbl.Text = value; }
}

然后调用它,您可以将其与其余声明一起放在窗口/页面的顶部:

xmlns:Controls="clr-namespace:SomeNameSpace" 

然后您可以像这样将控件插入到您的窗口/页面中:

<Controls:NameOfYourControl FieldName="Field One:" FieldValue="{Binding dataObject.field1}"/>

【讨论】:

  • 感谢您的详尽回复!
  • +1,有时很好地使 CLR 属性依赖属性。
  • 显然完全有必要创建这些依赖属性。该字段每隔几秒就会使用来自串行端口连接的值进行更新。所以我试图将 fieldValue 绑定到我的业务对象上的一个属性,但我似乎无法让依赖属性的东西工作。这是提出后续问题的适当方式,还是我需要提出一个新问题?
  • 我会开始一个新问题。您最初的问题是如何制作模板,我的回复对此进行了回答。持续更新 DP 需要一个新问题。
【解决方案2】:

您可以创建一个名为FieldControlUserControl,并为FieldNameFieldValue 定义支持(自动)属性。 (普通属性就可以了,只要你只需要绑定一次,可能就是这种情况。)

XAML 代码可能如下所示:

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="foo.bar">
    <StackPanel Style="{StaticResource horizontalStackerStyle}">
        <Label Style="{StaticResource labelStyle}" Content="{Binding Path=FieldName, Mode=OneTime, StringFormat='{0}: '}"/>
        <Label Style="{StaticResource valueStyle}" Content="{Binding Path=FieldValue, Mode=OneTime}" />
    </StackPanel>
</UserControl>

希望对您有所帮助。

【讨论】:

  • 显然我没有足够的声望来投赞成票。但更彻底地回答你:它帮助我看到了 XAML 的形式,这是一个开始。但是我发现要使这个 UserControl 有用,我需要设置依赖属性并弄清楚如何绑定所有内容。到目前为止,没有运气。
  • Klay:对不起,我的错——我在我的代表处忘记了这些事情!好吧,我很高兴它至少帮助您理解了一些事情。为您的问题 +1。
【解决方案3】:

您想要做的类似于关于将图像放在按钮上的讨论,使用指定路径的简单方法,如&lt;Button MyImage="foo.jpg" /&gt;。关注this article了解具体详情。

总结一下:

  • 一种明显的方法是创建一个包含两个标签并公开两个属性的 UserControl。这里没有太多模板。

  • 最 WPFish 的解决方案似乎是在一个标签上使用两个附加属性(比如值),并为其提供一个包含另一个标签(描述)的控件模板。在模板中,您将每个标签文本绑定到相应的附加属性值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2015-09-07
    • 2012-08-18
    • 1970-01-01
    相关资源
    最近更新 更多