【问题标题】:How to set WPF default values for properties, if possible?如果可能,如何为属性设置 WPF 默认值?
【发布时间】:2013-03-14 21:42:48
【问题描述】:

我刚刚开始 WPF,这让我非常沮丧。似乎许多属性默认为空(至少是我目前正在处理的那些),因此当它编译和运行时,什么也没有发生。

是否有快速的方法或标准的工作流程来设置 WPF 对象的默认值?

例如,我在 XAML 视图中放置了一个 Canvas 和一个 Button,然后转到代码视图将 Button 上的事件处理程序添加到 Canvas.Children.Add(new Ellipse()),然后没有任何反应。然后我想也许我应该指定宽度和高度。仍然没有任何反应。最后,经过一番挣扎,我找到了Shape.Stroke 属性。

那么就没有直观的Ellipse.XEllipse.Y 来定位Ellipse。同样,花了一个小时找到Canvas.SetLeft()

最后一根稻草是当我尝试做Canvas.SetLeft(Random.Next(0, (int)Canvas.Width)); 它给出一个运行时错误 因为Canvas.WidthNULL?!!?天哪……

当然,WPF 提供了很多功能,但似乎很多工作来自 Winforms Graphics.DrawEllipse() .. *sweat*

【问题讨论】:

  • 你好杰克。还记得我告诉过你不要在代码中操作 UI 元素吗?这就是为什么。在这种情况下,您应该使用ActualWidth 而不是Width
  • 另外,我强烈建议您使用Snoop。这将在处理 WPF 可视化树时为您提供很多帮助(您可以检查正在运行的应用程序,并查看可视化树中的内容以及所有内容的所有属性。
  • 再为 Snoop 投票:它让您的生活更加愉快。
  • @Jerkimball 我错过了鼠标点击,我把赏金给了另一个人。对不起,我欠你的债.. =(
  • Sure, WPF gives a lot of features, but seems like a lot of work coming from a Winforms Graphics.DrawEllipse() .. *sweat* - 问题是你太习惯于 winforms 及其所有的 hack。 WPF 需要完全不同的心态(我也已经告诉过你了)。不要试图以 winforms 的方式使用 WPF,你不会有这些挫败感。 WPF 没有挫败感,只有简单、简单的属性和INotifyPropertyChanged...

标签: wpf wpf-controls


【解决方案1】:

在 WPF 中,如果您没有在 xaml 中显式设置 Width/Height,则大小将由 Elements 布局 Container 确定,因此要访问这样的元素的 Width/Height,请使用属性ActualWidth/Actualheight,这些返回 Rendered 的大小 Element

例子:

Canvas.SetLeft(Random.Next(0, (int)Canvas.ActualWidth));

如果您想为Element 创建Default 值,您可以在xaml 中为Element 创建一个样式

例子:

<Style TargetType="Ellipse">
    <Setter Property="Stroke" Value="Black"/>
</Style>

【讨论】:

  • 在我的情况下发生的事情是我将 Cavas 从工具箱拖放到表单区域,Visual Studio 自动为我设置边距,但我很震惊 Width 不是自动派生的,而是仍然为空。但是使用样式是有道理的......虽然感觉只是为了让简单的 hello world 工作起来需要很多开销。
【解决方案2】:

WPF 确实有一个粗略的学习曲线。更困难的事情之一是放弃您可能习惯的技术并接受 WPF 方法。 Xaml 是定义控件及其属性的方法 - Xaml 是一种语言,其唯一真正目的是做好声明。本质上,将代码的 Xaml 部分视为一个美化的构造函数。

<Window x:Class="TestWpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Name="Window"
        Title="MainWindow"
        Width="640"
        Height="480">       
    <Canvas>
        <Ellipse Canvas.Left="50"
                 Canvas.Top="50"
                 Width="142"
                 Height="88"
                 Fill="Black" />
    </Canvas>
</Window>

上面的声明利用了 Xaml 对Attached Properties 的优美语法。

如果您发现自己经常在类似对象上设置一组通用属性,您可能需要调查 Styles

【讨论】:

  • 也许是因为我还是个菜鸟,但我根本不明白在设计时把省略号放进去有什么用。我知道省略号可以是模板,而 Left、Top、Width、Height 和 Fill 属性可以来自绑定。但这似乎非常具有限制性,因为并非我的所有 UIElement 都可能遵循单个模板。
  • 我只是想回答你的问题。您问为控件设置默认值的标准方法是什么,就是这样。如果您需要椭圆位置的动态行为,那么这是一个不同的问题。这些不是设计时设置,顺便说一句,这是在您的 Window(或 UserControl)构造函数中运行的代码。这就是 InitializeControl() 所做的。
猜你喜欢
  • 1970-01-01
  • 2019-09-24
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多