2

我刚刚开始 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().. *汗*

4

2 回答 2

2

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

例子:

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

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

例子:

<Style TargetType="Ellipse">
    <Setter Property="Stroke" Value="Black"/>
</Style>
于 2013-03-14T22:05:57.743 回答
1

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漂亮的语法。

如果您发现自己经常在类似对象上设置一组通用属性,您可能想要研究样式。

于 2013-03-14T22:03:11.820 回答