Q1: не так далеко, как я знаю
Q2: я бы сказал, что стиль - это путь, и вы, безусловно, можете создать свой собственный класс, который получается из кнопки и выбирает радиус правого угла на основе того, является ли он левым, средним или правым.
Q3: Должен быть выполним с пользовательским преобразователем значений и вашим собственным стилем.
В заключение. В этом случае я мог бы испытать желание поместить градиент фона и радиус угла на окружающую панель стека. Кнопки будут прозрачными с текстом. Тогда вам не придется иметь дело с радиусом угла на отдельных кнопках.
Редактировать: добавлен код и стиль для ответа на вопрос 3 выше. К ОП; Я не уверен, что это именно то, что вы хотели, но, возможно, здесь есть что-то, что может вас заинтересовать.
То, как я вас интерпретировал, заключалось в том, что вы хотите установить фон кнопки на определенный цвет, но он должен быть визуализирован как линейный градиент на основе этого цвета. Другие авторы упоминали маски непрозрачности, и это совсем не плохая идея. Я думал, что покажу, как это сделать с помощью пользовательских преобразователей значений.
Идея состоит в том, что я создаю пользовательское преобразованное значение, которое преобразует кисть со сплошным цветом в кисть с линейным градиентом. Затем я использую этот конвертер, чтобы преобразовать цвет фона кнопки из однотонной кисти в кисть с линейным градиентом.
Вот пользовательский преобразователь значений:
class SolidColorBrushToGradientConverter : IValueConverter
{
const float DefaultLowColorScale = 0.95F;
public object Convert (object value, Type targetType, object parameter, CultureInfo culture)
{
var solidColorBrush = value as SolidColorBrush;
if (!targetType.IsAssignableFrom (typeof (LinearGradientBrush)) || solidColorBrush == null)
{
return Binding.DoNothing;
}
var lowColorScale = ParseParameterAsDouble (parameter);
var highColor = solidColorBrush.Color;
var lowColor = Color.Multiply (highColor, lowColorScale);
lowColor.A = highColor.A;
return new LinearGradientBrush (
highColor,
lowColor,
new Point (0, 0),
new Point (0, 1)
);
}
static float ParseParameterAsDouble (object parameter)
{
if (parameter is float)
{
return (float)parameter;
}
else if (parameter is string)
{
float result;
return float.TryParse(
(string) parameter,
NumberStyles.Float,
CultureInfo.InvariantCulture,
out result
)
? result
: DefaultLowColorScale
;
}
else
{
return DefaultLowColorScale;
}
}
public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}
Затем я ссылаюсь на это в стиле, который я скопировал у вас (в основном то же самое, но я немного изменил структуру), важная часть строки такова:
Background="{Binding Path=Background,Mode=OneWay,RelativeSource={RelativeSource Mode=TemplatedParent}, Converter={StaticResource SolidColorBrushToGradientConverter}, ConverterParameter=0.95}"
Это означает, что мы привязываемся к шаблонному родительскому фону (т.е. Button.Background), мы используем конвертер SolidColorBrushToGradientConverter с параметром 0,95 (это определяет, насколько темнее «низкий» цвет должен сравниваться с «высоким» цветом) .
Полный стиль:
<local:SolidColorBrushToGradientConverter x:Key="SolidColorBrushToGradientConverter" />
<Style x:Key="GoogleMiddleButton" TargetType="{x:Type Button}">
<Setter Property="Background" Value="#F5F5F5" />
<Setter Property="Foreground" Value="#666666"/>
<Setter Property="FontFamily" Value="Arial"/>
<Setter Property="FontSize" Value="13"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border
Name="dropShadowBorder"
BorderThickness="0,0,0,1"
CornerRadius="1"
>
<Border.BorderBrush>
<SolidColorBrush Color="#00000000"/>
</Border.BorderBrush>
<Border Name="border"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}"
CornerRadius="0"
Background="{Binding Path=Background,Mode=OneWay,RelativeSource={RelativeSource Mode=TemplatedParent}, Converter={StaticResource SolidColorBrushToGradientConverter}, ConverterParameter=0.95}"
>
<Border.BorderBrush>
<SolidColorBrush Color="#D8D8D8"/>
</Border.BorderBrush>
<ContentPresenter
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
/>
</Border>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" TargetName="border">
<Setter.Value>
<SolidColorBrush Color="#939393"/>
</Setter.Value>
</Setter>
<Setter Property="BorderBrush" TargetName="dropShadowBorder">
<Setter.Value>
<SolidColorBrush Color="#EBEBEB"/>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="#4A8FF7" />
<Setter Property="Foreground" Value="#F5F5F5" />
<Setter Property="BorderBrush" TargetName="border">
<Setter.Value>
<SolidColorBrush Color="#5185D8"/>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>