Можем мы управлять (вычесть) значение свойства в то время как шаблонная привязка?

Я в настоящее время определяю немного сеток как следующее:

<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.

6
задан Simsons 29 April 2010 в 04:23
поделиться

3 ответа

Вы задали несколько хороших вопросов; однако мы часто зацикливаемся на поиске решения, не обращая внимания на исходную проблему. Прежде чем пытаться ответить на ваши вопросы, я хотел бы исследовать ваши ожидания от макета.

Предоставленный вами код предполагает, что у вас есть настраиваемый элемент управления (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>

Если вы все же хотите измерить высоту строк, вам необходимо внести несколько исправлений.

  1. Математические операции не могут выполняться в расширениях разметки (фигурных скобках). Ваш подход с разделением может не вызывать исключение синтаксического анализа xaml, но я сомневаюсь, что он работает правильно. Преобразователь значений необходим для выполнения того, что вы хотите.

  2. 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).

9
ответ дан 8 December 2019 в 18:33
поделиться

Я думаю, вам нужно использовать Converter для этой цели

2
ответ дан 8 December 2019 в 18:33
поделиться

Почему бы вам просто не умножить одну пятую на 0,8?

2
ответ дан 8 December 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: