如何在WPF中精确设置左右边界渐变

如何在WPF中精确设置左右边界渐变,wpf,Wpf,我有一个边框,我正试图将它的边框笔刷设置为左边框渐变从#d3d3到BFBFBF,右边框渐变从#BFBFBF到#717171。问题是如果我这样做: <Setter Property="BorderBrush"> <Setter.Value> <LinearGradientBrush StartPoint="0,0" EndPoint="1,0"> <GradientStop Offset="0" Color=

我有一个
边框
,我正试图将它的
边框笔刷
设置为左边框渐变从
#d3d3
BFBFBF
,右边框渐变从
#BFBFBF
#717171
。问题是如果我这样做:

<Setter Property="BorderBrush">
    <Setter.Value>
        <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
            <GradientStop Offset="0" Color="#D3D3D3"/>
            <GradientStop Offset="0.1" Color="#BFBFBF"/>
            <GradientStop Offset="0.9" Color="#BFBFBF"/>
            <GradientStop Offset="1" Color="#717171"/>
        </LinearGradientBrush>
    </Setter.Value>
</Setter>

我需要正确选择偏移量,这很难。此外,我需要不同的边界大小不同的偏移。通常,如果我有
BorderThickness=10,0,10,0
,我希望边框渐变在左侧部分为0-10像素的C1-C2颜色,在右侧部分为0-10像素的C2-C3颜色(或
border.Width
-
border.Width+10
像素)。我不关心上下边框,我可以把它们作为纯色

我能实现我所描述的目标吗

我希望边框看起来像这样(这张图片是我正在尝试做的面板的底部裁剪):


我知道您还有其他建议-请在WPF中共享,您不能在边界元素的不同侧面使用不同的渐变

您应该改为使用两个嵌套的
边框
元素,一个只包含左侧,另一个包含右侧边框:

<Border BorderThickness="2,0,0,0">
    <Border.BorderBrush>
        <!-- Left side gradient -->
    </Border.BorderBrush>
    <Border BorderThickness="0,0,2,0">
        <Border.BorderBrush>
            <!-- Right side gradient -->
        </Border.BorderBrush>

        <!-- Content here -->
    </Border>
</Border>

您可能只需向控件添加一个“导体”,用于监视控件的更改(您可能可以为此使用附加的行为/属性)。它可以检查“边界厚度”属性,并在厚度更改时创建具有正确尺寸的渐变。您可以为该组件提供基色,它将使用该基色生成gradients@Charleh我可以这么做,但听起来很烦人。。。我试图模仿的这些面板都在旧的QT程序和晚Win 98设计中,我不能相信WPF不能以更简单的方式做到这一点。不管怎样,谢谢你的提示——如果我找不到更好的解决方案,我就不得不这样做。我觉得你的回答应该能让我达到我想要的结果,但我还是错过了一点。我可以通过
MappingMode=absolute
对左边框进行绝对定位,但如何对右边框进行绝对定位?我希望正确的渐变从元素宽度开始到(宽度+边框宽度)@Archeg。看来设置正确的边框毕竟不是那么容易。请参阅我的编辑。我会将此标记为答案,但由于解决方案的复杂性,我会避免使用它(因此我不会破坏我的xaml,因为我有许多这样的面板),除非我被要求严格遵循设计,因为客户还不确定是否允许我偏离。谢谢。@Archeg对于
ContentControl
,您可以将其包装为
ControlTemplate
<StackPanel Orientation="Horizontal">
    <Rectangle Width="10">
        <Rectangle.Fill>
              <!-- Left side gradient -->
        </Rectangle.Fill>
    </Rectangle>

    <!-- Content here -->

    <Rectangle Width="10">
        <Rectangle.Fill>
              <!-- Right side gradient -->
        </Rectangle.Fill>
    </Rectangle>
</StackPanel>