<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)}"/>
仍然没有结果.任何建议PLZ.
谢谢,
Subhen
**
更新
**
现在在我的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,CultureInfo culture) { throw new NotImplementedException(); } #endregion }
但是在元素RowDefination中获得异常未知元素高度.
更新代码@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),其实例的高度为300px.应用于此控件的ControlTemplate有4行,它们根据实例高度计算出高度.根据这些设置,您的4行将具有以下值:
第0行:240
第1:20行
第2行:60
第3行:50
这些总数达到370px,比对照大70px.这意味着第3行将完全隐藏在视图中,而第2行将被剪切到前40px.我认为这不是你的意图.如果这是您的意图,那么下面的答案将有助于您走上正轨.如果您打算根据比例缩放行高,则可以使用星形大小调整.您建议的比例将使用以下设置:
<Grid.RowDefinitions> <RowDefinition Height="240*"/> <RowDefinition Height="20*"/> <RowDefinition Height="60*"/> <RowDefinition Height="50*"/> </Grid.RowDefinitions>
如果您仍想测量行的高度,则需要进行一些修正.
>无法在标记扩展(花括号)中执行数学运算.你的除法方法可能不会抛出xaml解析异常,但我怀疑它是否正常工作.值转换器是完成您想要的所必需的.
> TemplateBinding实际上只是RelativeSource绑定的轻量级版本.由于TemplateBinding重量轻,因此不允许使用转换器.
要获得预期的行为,您需要使用与RelativeSource的绑定.因此,您想要的代码看起来像这样:
<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,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,System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } #endregion
如果你想在同一个Binding中加入除法和减法,你需要创建一个特殊的转换器,或者使用MultiBinding(这也需要你创建一个特殊的MultiBindingConverter).