gpt4 book ai didi

wpf - 我们可以在模板绑定(bind)时操作(减去)属性的值吗?

转载 作者:行者123 更新时间:2023-12-04 13:35:22 24 4
gpt4 key购买 nike

我目前正在定义几个网格如下:

<Grid.RowDefinitions>
<RowDefinition Height="{TemplateBinding Height-Height/5}"/>
<RowDefinition Height="{TemplateBinding Height/15}"/>
<RowDefinition Height="{TemplateBinding Height/20}"/>
<RowDefinition Height="{TemplateBinding Height/6}"/>
</Grid.RowDefinitions>

虽然除法工作正常,但减法并没有产生输出。

我也试过如下:
<RowDefinition Height="{TemplateBinding Height-(Height/5)}"/>

还是没有结果。任何建议请。

谢谢,
苏亨

**

更新

**
现在在我的 XAML 中,我尝试实现 IvalueConverter,如下所示:
<RowDefinition Height="{TemplateBinding Height, Converter={StaticResource heightConverter}}"/>

将引用添加为
<local:medieElementHeight x:Key="heightConverter"/>

在 generic.cs 中,我编码如下:
public class medieElementHeight : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
//customVideoControl objVdeoCntrl=new customVideoControl();
double custoMediaElementHeight = (double)value;//objVdeoCntrl.customMediaPlayer.Height;

double mediaElementHeight = custoMediaElementHeight - (custoMediaElementHeight / 5);
return mediaElementHeight;
}


#region IValueConverter Members


object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}

#endregion
}

但是在元素 RowDefination 中得到异常 Unknown Element Height。

更新代码@Tony
<Style TargetType="local:customVideoControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:customVideoControl">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="{TemplateBinding Height-Height/5}"/>
<RowDefinition Height="{TemplateBinding Height/15}"/>
<RowDefinition Height="{TemplateBinding Height/20}"/>
<RowDefinition Height="{TemplateBinding Height/6}"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
<MediaElement x:Name="customMediaPlayer"
Source="{TemplateBinding CustomMediaSource}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Height="{TemplateBinding Height}"
Width="{TemplateBinding Width}"
Grid.Row="0" Grid.ColumnSpan="3"
/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

现在,我的实现 XAML 文件包含如下:
<customMediaElement:customVideoControl x:Name="custMediaElement" Width="400" Height="300"  nextBtnEvent="custMediaElement_nextBtnEvent" prevBtnEvent="custMediaElement_prevBtnEvent" Visibility="Collapsed"/>

现在,我想根据 custMediaElement 的高度减去或除值。

最佳答案

你提出了几个很好的问题;然而,我们经常陷入寻找解决方案的过程中而忽略了最初的问题。在尝试回答您的问题之前,我想先了解一下您对布局的期望。

您提供的代码表明您有一个自定义控件 (customVideoControl),其实例的高度为 300 像素。应用于此控件的 ControlTemplate 有 4 行,它们根据实例高度计算了高度。根据这些设置,您的 4 行将具有以下值:

第 0 行:240
第 1 行:20
第 2 行:60
第 3 行:50

这些总计为 370px,比控件大 70px。这意味着第 3 行将完全隐藏在 View 之外,第 2 行将被剪裁到顶部 40px。我认为这不是你的意图。如果这是您的意图,那么下面的答案有望在您的道路上对您有所帮助。如果您的意图是根据比率缩放行高,那么您可以使用星号。您建议的比率将使用以下设置:

    <Grid.RowDefinitions>
<RowDefinition Height="240*"/>
<RowDefinition Height="20*"/>
<RowDefinition Height="60*"/>
<RowDefinition Height="50*"/>
</Grid.RowDefinitions>

如果您仍想测量行的高度,则需要进行一些更正。
  • 数学运算不能在标记扩展(花括号)中执行。您的除法方法可能不会引发 xaml 解析异常,但我怀疑它是否正常工作。值(value)转换器是完成你想要的东西所必需的。
  • TemplateBinding 实际上只是 RelativeSource 绑定(bind)的轻量级版本。由于 TemplateBinding 是轻量级的,它不允许转换器。

  • 要获得您的预期行为,您需要使用具有 RelativeSource 的绑定(bind)。因此,您想要的代码如下所示:
    <RowDefinition Height="{Binding Path=Height, 
    RelativeSource={RelativeSource TemplatedParent},
    Converter={StaticResource DivisionConverter},
    ConverterParameter=15}"
    />

    其中 DivisionConverter 是自定义转换器的关键。此示例中的 ConverterParameter 允许开发人员传入分母,而不必为每个数字创建单独的转换器。

    这是您需要创建的自定义 DivisionConverter 的示例:
    public class DivisionConverter : IValueConverter
    {
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
    // Default to 0. You may want to handle divide by zero
    // and other issues differently than this.
    double result = 0;

    // Not the best code ever, but you get the idea.
    if (value != null && parameter != null)
    {
    try
    {
    double numerator = (double)value;
    double denominator = double.Parse(parameter.ToString());

    if (denominator != 0)
    {
    result = numerator / denominator;
    }
    else
    {
    // TODO: Handle divide by zero senario.
    }
    }
    catch (Exception e)
    {
    // TODO: Handle casting exceptions.
    }
    }

    return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
    throw new NotImplementedException();
    }

    #endregion

    如果您想在同一个 Binding 中合并除法和减法,您需要创建一个特殊的转换器,或者使用 MultiBinding(这也需要您创建一个特殊的 MultiBindingConverter)。

    关于wpf - 我们可以在模板绑定(bind)时操作(减去)属性的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2728736/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com