Так в основном Вы хотите узнать, является ли конкретный пользователь человеком, не заставляя их доказать его. Насколько я знаю, что это невозможно по Интернету, извините.
я предлагаю изменить механизм на аукцион.
Ключ состоит в том, чтобы понять, что установка его в таком коде:
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.
Вы не можете определить только верхнее поле с привязкой, потому что 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>
Разве это не то, что вы ищете?
<StackPanel Margin="0,10,0,0" />
Первое значение: левое поле, затем верхнее, затем правое и последнее, но не менее важное, нижнее.
Я не уверен, что вы хотите привязать его к чему-то, но если нет, то это сработает.
Используйте конвертер, пример кода ниже преобразует двойное значение, к которому вы привязаны, в толщину. Он установит «Верх» толщины для связанного поля. При желании вы можете использовать ConverterParameter, чтобы определить привязку к левому, верхнему, правому или нижнему краям.
<StackPanel Margin="{Binding TopMargin, Converter={StaticResource MyThicknessConverter}">
.
public class ThicknessSingleValueConverter : IValueConverter
{
override Convert(...)
{
return new Thickness(0, (double)object, 0, 0);
}
//etc...
Я подумал, что вы можете использовать синтаксис свойства из MSDN :
<object.Margin>
<Thickness Top="{Binding Top}"/>
</object.Margin>
Тогда вам не понадобится никакой конвертер
Но верхняя часть не является DependancyProperty - назад в конвертер
Что было бы неплохо, чтобы иметь возможность сделать это, указав что-то вроде пример кода ниже.
<StackPanel Margin=",10,,">
К сожалению, эта возможность, похоже, не существует по умолчанию в WPF, и это позор, потому что это требует, чтобы разработчики к трудному коду известны значения по умолчанию таким образом, чтобы позже затрудняют кожу или тему приложения.
Наилучшее решение, которое я могу подумать в этот момент, использует конвертер, но сумма дополнительного кода, который вы должны производить, чтобы представить это не идеально.