【问题标题】:WPF xaml controls within a canvas not having a canvas.right property画布中的 WPF xaml 控件没有 canvas.right 属性
【发布时间】:2015-10-19 17:29:08
【问题描述】:

所以我正在使用 C#/XAML 为 Windows 8 制作应用程序(希望也可以轻松移植到 Windows 10),并且在 UI 方面遇到了一些问题,特别是在画布方面。该应用程序最突出的功能之一是我需要在其中放置对象的大型周历。

在应用程序的编码中,我需要这些东西才能在网格周围移动并改变高度。在测试中,我使用基本的实心矩形执行此操作。尽管它们看起来很丑,但这很容易。我有两种设计可供使用(在图像编辑器中制作),如图所示http://imgur.com/N5Jv16z

理想情况下,我可以使用该图像中的第二个,尽管事实证明这很困难。首先,我只使用具有半透明背景颜色的边框,然后在左侧有一个实心矩形。如果边界允许两个孩子,这也适用于第二个选项。

所以我找到了画布控件(我以前从未使用过)并试图让它工作,因为它似乎最有希望,尽管我遇到了一个主要问题:它没有子控件的正确对齐选项。 Msdn 说它应该在那里,它不是。当我在 xaml 中键入 canvas.right="5" 时出现错误,因为它说此属性不存在。除此之外,画布似乎实际上并没有边缘。我可以让第二个矩形超出画布的右边缘,它仍然会显示,例如这个图像,其中小正方形的 canvas.left 被赋予 250:http://imgur.com/S46yMhU

由于大网格中每一列的大小是使用比例完成的,画布本身将具有可变宽度,所以我不能只给第二个矩形一个 canvas.left 属性,因为它只适用于离散像素。我还需要让这些矩形达到画布的整个高度,因为使用后面的代码我只想操作父对象,但是由于没有“底部”的类似原因,让它垂直拉伸不起作用到画布上。

如果这里重要的是我正在处理的 xaml 代码(取出额外的东西):

<Grid x:Name="tableGrid" HorizontalAlignment="Stretch" Margin="0,50,0,0" Grid.Row="1" VerticalAlignment="Stretch" Grid.Column="1">

    <Canvas Grid.Column="3" Height="100" Margin="1,1,2,2" Grid.Row="5" Grid.RowSpan="40" VerticalAlignment="Top" Background="#66104A7C">
        <Rectangle Fill="#FF104A7C" HorizontalAlignment="Left" Width="5" Height="50"/>
        <Rectangle Fill="#FF104A7C" HorizontalAlignment="Left" Width="5" Height="50" Canvas.Left="250" Margin="0,0,5,0"/>
    </Canvas>

</Grid>

我没有 canvas.right 属性是否有任何可解决的原因,因为它似乎可以简化一切。在画布中设置矩形的对齐方式不会做任何事情。也许另一个控件会比画布更好?我已经尝试过使用三个矩形(中间一个是半透明的)的 stackpanel,但我无法让它正确地改变宽度。有什么想法吗?

【问题讨论】:

    标签: c# wpf xaml canvas windows-8.1


    【解决方案1】:

    我认为您最好使用带有列和行的 Grid 控件来创建日期网格模式。

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/> <!--Sunday-->
            <ColumnDefinition/> <!--Monday-->
            <ColumnDefinition/> <!--Tuesday-->
            <ColumnDefinition/> <!--Wednesday-->
            <ColumnDefinition/> <!--Thursday-->
            <ColumnDefinition/> <!--Friday-->
            <ColumnDefinition/> <!--Saturday-->
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/> <!--Week1-->
            <RowDefinition/> <!--Week2-->
            <RowDefinition/> <!--Week3-->
            <RowDefinition/> <!--Week4-->
            <RowDefinition/> <!--Week5-->
        </Grid.RowDefinitions>
    <Grid>
    

    【讨论】:

    • 您的声明--“Canvas 不支持右对齐,只支持上左对齐。”是完全错误的。 MSDN doc msdn.microsoft.com/en-us/library/… 表明正确的存在。而这个wpf-tutorial.com/panels/canvas 表明你可以。
    • 你是对的。我从不使用画布,所以忘记了这一点。
    • 我想我应该链接更多的屏幕截图。我在这里已经有了周历布局:i.imgur.com/TLCHHnX.png。我试图让这些框在特定时间的特定时间出现指定的时间长度。可以为一个对象做所有这些,现在只需要让那个对象漂亮。
    • 我明白了。然后也许每天使用一个 StackPanel,其中包含事件的网格,Grid.Height 绑定到一个表示事件时间长度的数字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多