Как установить верхнее поле только в XAML?

  1. Продают товар к несценариям людей.
  2. не изводят 'нормальных' пользователей ни с какими задачами завершиться, чтобы доказать, что они являются человеческими.

Так в основном Вы хотите узнать, является ли конкретный пользователь человеком, не заставляя их доказать его. Насколько я знаю, что это невозможно по Интернету, извините.

я предлагаю изменить механизм на аукцион.

44
задан Community 23 May 2017 в 11:47
поделиться

6 ответов

Ключ состоит в том, чтобы понять, что установка его в таком коде:

sp2.Margin = new System.Windows.Thickness{ Left = 5 };

эквивалентна:

sp2.Margin = new System.Windows.Thickness{ Left = 5, Top = 0, Right = 0, Bottom = 0 };

Вы не можете установить только одно значение в От экземпляра толщины до либо кода, либо XAML . Если вы не установите некоторые значения, они будут неявно равны нулю. Таким образом, вы можете просто сделать это, чтобы преобразовать принятый образец кода в другом вашем вопросе в эквивалент XAML:

<StackPanel Margin="{Binding TopMargin, Converter={StaticResource MyConverter}}"/>

где MyConverter просто возвращает Thickness , который устанавливает только Вверх и оставляет все остальные значения равными нулю.

Конечно, вы можете написать свой собственный элемент управления, который предоставляет эти отдельные значения как свойства зависимостей, чтобы сделать ваш код немного чище:

<CustomBorder TopMargin="{Binding TopMargin}">
</CustomBorder>

Лучшим вариантом, чем настраиваемый элемент управления, было бы написать присоединенное свойство и изменить толщину, используя приведенный выше код в установщике свойства зависимости. Приведенный ниже код можно использовать для ВСЕХ элементов управления, у которых есть маржа.

public static readonly DependencyProperty TopMarginProperty =
    DependencyProperty.RegisterAttached("TopMargin", typeof(int), typeof(FrameworkElement),
                                        new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
public static void SetTopMargin(FrameworkElement element, int value)
{
    // set top margin in element.Margin
}
public static int GetTopMargin(FrameworkElement element)
{
    // get top margin from element.Margin
}

Если вы объедините это с поведением, вы можете получить изменения уведомлений в свойстве TopMargin.

37
ответ дан 26 November 2019 в 21:50
поделиться

Вы не можете определить только верхнее поле с привязкой, потому что Margin имеет тип Thickness , который не является объектом зависимости. Однако вы можете использовать MultiValueConverter , который будет принимать 4 значения полей для создания 1 объекта толщины

Конвертер:

public class ThicknessMultiConverter : IMultiValueConverter
{
    #region IMultiValueConverter Members

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double left = System.Convert.ToDouble(values[0]);
        double top = System.Convert.ToDouble(values[1]);
        double right = System.Convert.ToDouble(values[2]);
        double bottom = System.Convert.ToDouble(values[3]);
        return new Thickness(left, top, right, bottom);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        Thickness thickness = (Thickness)value;
        return new object[]
        {
            thickness.Left,
            thickness.Top,
            thickness.Right,
            thickness.Bottom
        };
    }

    #endregion
}

XAML:

<StackPanel>
    <StackPanel.Margin>
        <MultiBinding Converter="{StaticResource myThicknessConverter}">
            <Binding Path="LeftMargin"/>
            <Binding Path="TopMargin"/>
            <Binding Path="RightMargin"/>
            <Binding Path="BottomMargin"/>
        </MultiBinding>
    </StackPanel.Margin>
</StackPanel>
2
ответ дан 26 November 2019 в 21:50
поделиться

Разве это не то, что вы ищете?

<StackPanel Margin="0,10,0,0" />

Первое значение: левое поле, затем верхнее, затем правое и последнее, но не менее важное, нижнее.

Я не уверен, что вы хотите привязать его к чему-то, но если нет, то это сработает.

52
ответ дан 26 November 2019 в 21:50
поделиться

Используйте конвертер, пример кода ниже преобразует двойное значение, к которому вы привязаны, в толщину. Он установит «Верх» толщины для связанного поля. При желании вы можете использовать ConverterParameter, чтобы определить привязку к левому, верхнему, правому или нижнему краям.

<StackPanel Margin="{Binding TopMargin, Converter={StaticResource MyThicknessConverter}">

.

public class ThicknessSingleValueConverter : IValueConverter
{
    override Convert(...)
    {
         return new Thickness(0, (double)object, 0, 0);
    }

    //etc...
0
ответ дан 26 November 2019 в 21:50
поделиться

Я подумал, что вы можете использовать синтаксис свойства из MSDN :

      <object.Margin>
        <Thickness Top="{Binding Top}"/>
      </object.Margin>

Тогда вам не понадобится никакой конвертер

Но верхняя часть не является DependancyProperty - назад в конвертер

0
ответ дан 26 November 2019 в 21:50
поделиться

Что было бы неплохо, чтобы иметь возможность сделать это, указав что-то вроде пример кода ниже.

<StackPanel Margin=",10,,">

К сожалению, эта возможность, похоже, не существует по умолчанию в WPF, и это позор, потому что это требует, чтобы разработчики к трудному коду известны значения по умолчанию таким образом, чтобы позже затрудняют кожу или тему приложения.

Наилучшее решение, которое я могу подумать в этот момент, использует конвертер, но сумма дополнительного кода, который вы должны производить, чтобы представить это не идеально.

-3
ответ дан 26 November 2019 в 21:50
поделиться
Другие вопросы по тегам:

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