Я в настоящее время определяю немного сеток как следующее:
<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>
В то время как подразделение хорошо работает, вычитание не приводит к выводу.
Ialso попробовал как следующее:
<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.
Обновление кода @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"/>
Теперь, я хочу к substract или делю значения в зависимости от высоты custMediaElement.
Вы задали несколько хороших вопросов; однако мы часто зацикливаемся на поиске решения, не обращая внимания на исходную проблему. Прежде чем пытаться ответить на ваши вопросы, я хотел бы исследовать ваши ожидания от макета.
Предоставленный вами код предполагает, что у вас есть настраиваемый элемент управления (customVideoControl), высота экземпляра которого составляет 300 пикселей.ControlTemplate, примененный к этому элементу управления, имеет 4 строки, высота которых рассчитана на основе высоты экземпляра. Исходя из этих настроек, ваши 4 строки будут иметь следующие значения:
Строка 0: 240 Строка 1: 20 Строка 2: 60 Строка 3: 50
Итого 370 пикселей, что на 70 пикселей больше, чем у элемента управления. Это означает, что строка 3 будет полностью скрыта от просмотра, а строка 2 будет обрезана до верхних 40 пикселей. Я предполагаю, что это не ваше намерение. Если это ваше намерение, то ответы ниже, надеюсь, помогут вам на вашем пути. Если вы намерены масштабировать высоту строк на основе соотношения, вы можете использовать размер звездочки. Предлагаемое вами соотношение будет использовать следующие настройки:
<Grid.RowDefinitions>
<RowDefinition Height="240*"/>
<RowDefinition Height="20*"/>
<RowDefinition Height="60*"/>
<RowDefinition Height="50*"/>
</Grid.RowDefinitions>
Если вы все же хотите измерить высоту строк, вам необходимо внести несколько исправлений.
Математические операции не могут выполняться в расширениях разметки (фигурных скобках). Ваш подход с разделением может не вызывать исключение синтаксического анализа xaml, но я сомневаюсь, что он работает правильно. Преобразователь значений необходим для выполнения того, что вы хотите.
TemplateBinding - это просто облегченная версия привязки RelativeSource. Поскольку TemplateBinding имеет небольшой вес, он не поддерживает преобразователи.
Чтобы добиться ожидаемого поведения, вам нужно использовать Binding с 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, 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).
Я думаю, вам нужно использовать Converter для этой цели