【问题标题】:How to set XAML property via a function call?如何通过函数调用设置 XAML 属性?
【发布时间】:2013-04-10 14:52:46
【问题描述】:

我有一个简单的页面,其中包含一个矩形、一个椭圆、两个滑块和一个文本块。

两个滑块控制(通过绑定)矩形的高度和宽度。

我想根据矩形尺寸的最小值来设置椭圆的宽度和高度。 XAML 代码如下所示:

<UserControl
x:Class="App16.MyUserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App16"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="400"
d:DesignWidth="400"
x:Name="MyRoot">   

<Grid Background="Black">

    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
        <RowDefinition Height="2*" />
        <RowDefinition />
    </Grid.RowDefinitions>

    <Rectangle Name="rect" Fill="Yellow" 
               Width="{Binding ElementName=rectX,Path=Value}" 
               Height="{Binding ElementName=rectY,Path=Value}" Grid.Column="0"/>

    <Ellipse Fill="Yellow" 
             Width="{Binding ElementName=MyRoot,Path=SampleFunction}" 
             Height="{Binding ElementName=MyRoot,Path=SampleFunction}" Grid.Column="1" />

    <StackPanel Grid.Row="1" Grid.ColumnSpan="2">                       
        <Slider Name="rectX" HorizontalAlignment="Stretch" Minimum="100" Maximum="200" Value="150" />
        <Slider Name="rectY" HorizontalAlignment="Stretch" Minimum="100" Maximum="200" Value="150" />
        <TextBlock Foreground="White" Text="{Binding ElementName=MyRoot, Path=SampleFunction}" />
    </StackPanel>

</Grid>

后面的代码是这样的:

public Double SampleFunction {             
        get { return (rect.Width <= rect.Height ? rect.Width : rect.Height); }
    }

在当前状态下,矩形会根据滑块中的值正确调整大小,但在页面加载后永远不会调用“SampleFunction”。

当然,我可以使用“RESIZED”事件来做到这一点,但我想知道如果不这样做,这是否可能。

有什么建议吗?当用户调整滑块控件时,我希望看到矩形和椭圆改变大小。

谢谢!

【问题讨论】:

    标签: c# wpf xaml windows-runtime winrt-xaml


    【解决方案1】:

    Henk 对我的评论提出的建议将使它起作用,但实际上对于您的方案,您可以完全删除绑定并简单地设置

    <Ellipse
        Fill="Yellow"
        VerticalAlignment="Stretch"
        HorizontalAlignment="Stretch"
        Stretch="Uniform" />
    

    【讨论】:

      【解决方案2】:

      您的SampleFunction需要重命名(它是一个属性,而不是一个函数)。

      为了使其适用于 DataBinding,它需要实现 INotifyPropertyChanged

      另外,内部逻辑大概应该基于ActualWidthActualHeight

      【讨论】:

      • 由于绑定的源是一个控件 (UserControl) - 它实际上需要是一个依赖属性。 INotifyPropertyChanged 不属于控件。那么这将是太多的工作,我宁愿简单地处理一个 MyRoot.SizeChanged 事件来进行计算,如果它们确实是必要的。
      猜你喜欢
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      相关资源
      最近更新 更多