3

一部の xaml では、各コーナーから数ピクセルだけの境界線が必要です。したがって、上部に沿って、境界線は、たとえば、左端の 5 ピクセルの黒になり、その後、右端の 5 ピクセルまで上部の残りの部分で透明になり、次に境界線の最後の 5 ピクセルが透明になります。右端は黒になります。その意図は、場合によっては透過的なものを選択するためのガイダンスを提供することです。ただし、このアプリケーションでは、完全な境界線が存在すると、(知覚的視覚的な意味で) コンテンツが妨げられます。角は丸くありません。

次のようになります。

--          --
|            |




|            |
--          --

この効果を得るには、どのタイプのブラシを使用すればよいですか?

次のように、線形グラデーションを試しました。

<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
    <GradientStop Color="Black" Offset="0" />
    <GradientStop Color="Black" Offset="0.01" />
    <GradientStop Color="Transparent" Offset="0.0101" />
    <GradientStop Color="Transparent" Offset="0.9899" />
    <GradientStop Color="Black" Offset="0.99" />
    <GradientStop Color="Black" Offset="1" />
</LinearGradientBrush>

もちろん、これは左上と右下だけです。これは意図したアプリケーションでは妥当かもしれませんが、各コーナーの線のサイズは、境界領域が正方形の場合にのみ同じです (たとえば、境界領域が長い長方形の場合、境界のセクションは 1 つの領域に沿ってはるかに長くなります)。側よりも側)。

グラデーション ブラシの MappingMode 値が「Absolute」であることを確認しました。これは左上隅ではうまく機能しますが、他の隅では機能しません。

また、リングをコーナーに当てることができると考えて、RadialGradientBrush も試しましたが、リングを正しく中央に配置することも、辺に沿って等長にすることもできませんでした。

これは ListBox の ItemContainerStyle の一部であり、枠線は IsSelected のトリガーで変更されます。このため、ボーダー内(ボーダー内など)のボーダーもできません。

編集 #2: VisualBrush も試しました。グリッドで必要な動作 (少なくともストレッチ動作) が得られることはわかっていました。

<VisualBrush Stretch="Fill">
    <VisualBrush.Visual>
        <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="10" MaxWidth="10" MinWidth="10" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="10" MaxWidth="10" MinWidth="10" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="10" MaxHeight="10" MinHeight="10" />
                <RowDefinition Height="*" />
                <RowDefinition Height="10" MaxHeight="10" MinHeight="10" />
            </Grid.RowDefinitions>
            <Rectangle Grid.Column="0" Grid.Row="0" Fill="Black" />
            <Rectangle Grid.Column="1" Grid.Row="0" Fill="Transparent" />
            <Rectangle Grid.Column="2" Grid.Row="0" Fill="Black" />
            <Rectangle Grid.Column="0" Grid.Row="1" Fill="Transparent" />
            <Rectangle Grid.Column="1" Grid.Row="1" Fill="Transparent" />
            <Rectangle Grid.Column="2" Grid.Row="1" Fill="Transparent" />
            <Rectangle Grid.Column="0" Grid.Row="2" Fill="Black" />
            <Rectangle Grid.Column="1" Grid.Row="2" Fill="Transparent" />
            <Rectangle Grid.Column="2" Grid.Row="2" Fill="Black" />
        </Grid>
    </VisualBrush.Visual>
</VisualBrush>

しかし、これもうまくいきません。ブラシ内で同じようにサイジングが行われないようです。この場合、VisualBrush のグリッドのサイズは最終的に 20x20 になり、中央の透明部分はスペースを占有しません。Horizo​​ntalAlignment と VerticalAlignment を Stretch に設定しても効果はありませんでした。VisualBrush の Stretch="Fill" も何もしませんでした。

編集#1:より広い文脈:

<ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}">
        <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/>
        </Style.Resources>
        <Setter Property="Margin" Value="3" />
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="BorderThickness" Value="5" />
                <Setter Property="Padding" Value="0" />
                <Setter Property="BorderBrush" Value="Fuchsia" />
            </Trigger>
            <Trigger Property="IsSelected" Value="False">
                <Setter Property="BorderThickness" Value="1" />
                <Setter Property="Padding" Value="4" />
                <Setter Property="BorderBrush">
                    <Setter.Value>
                        <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                            <GradientStop Color="Black" Offset="0" />
                            <GradientStop Color="Black" Offset="0.01" />
                            <GradientStop Color="Transparent" Offset="0.0101" />
                            <GradientStop Color="Transparent" Offset="0.9899" />
                            <GradientStop Color="Black" Offset="0.99" />
                            <GradientStop Color="Black" Offset="1" />
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</ListBox.ItemContainerStyle>
4

3 に答える 3

1

これは楽しい質問なので、さらに別の可能性があります。これが私の以前の回答とは完全に別の回答であることに同意していただければ幸いです...

グリッド内に含まれる単純な形状の複合セットを使用して、目的の効果を実現できます。「コンテンツ」ボックスを 4 つの黒い長方形の上に重ね、各黒い長方形をグリッドの適切なコーナーに配置します。

これが私のくだらないペイントのイラストです。繰り返しますが、赤いボックスはコンテンツを示しています。その赤いボックスの外側はすべて、ユーザーに境界として表示されます。

ここに画像の説明を入力

そして、コードを使用した実際の例:

<Grid HorizontalAlignment="Center" VerticalAlignment="Center" Width="300" Height="200">
    <!-- These rectangles will be the four corner "borders" -->
    <Rectangle Fill="Black" Width="50" Height="50" HorizontalAlignment="Left" VerticalAlignment="Top" />
    <Rectangle Fill="Black" Width="50" Height="50" HorizontalAlignment="Left" VerticalAlignment="Bottom" />
    <Rectangle Fill="Black" Width="50" Height="50" HorizontalAlignment="Right" VerticalAlignment="Top" />
    <Rectangle Fill="Black" Width="50" Height="50" HorizontalAlignment="Right" VerticalAlignment="Bottom" />

    <!-- Here is the content.  The "margin" property will effectively be the thickness of your corner borders. -->
    <Rectangle Fill="Red" Margin="2" />        
</Grid>

次のようになります。

ここに画像の説明を入力

これには、非常にうまくスケーリングできるという追加の利点があります。コンテンツのサイズに関係なく、角の境界線は常に同じサイズになります。さらに、境界線は、前の放射状ブラシの回答のように「奇妙」に見えることなく、好きな太さにすることができます。

于 2014-01-03T18:50:55.180 に答える
1

放射状グラデーション ブラシは、おそらく探しているものを実現します。放射状ブラシの中心をボックスの中心に設定します。透明な中心の色から始めて、中心から目的の「境界の色」(黒) までフェードし、次に半径を十分に大きく設定して、黒の色が隅にのみ表示されるようにします。

そして、「グラデーション」を非常に短く設定してください。徐々にフェードしないで、シャープにします。

適切なサイズにすると、下に (不十分に) 示されているのと同様の効果が得られます。赤いボックスはコンテンツを表します。そのボックスの外にあるものはすべて、コーナーがどのように見えるかを示しています。「透明」部分の半径を大きくして、黒い角を小さくします。

ついに; これは、細い境界線でのみ見栄えがよくなります。太い境界線がある場合、コーナー ブラシの「先端」で「おかしい」ように見えます。

ここに画像の説明を入力

アップデート:

いくつかのコードを使用した実際の例を次に示します。

<Border BorderThickness="1" Height="100" Width="100">
    <Border.BorderBrush>
        <RadialGradientBrush RadiusX="0.6" RadiusY="0.6">
            <GradientStop Color="Black" Offset="1"/>
            <GradientStop Color="#00000000" Offset="0.99"/>
        </RadialGradientBrush>
    </Border.BorderBrush>
    <Rectangle Fill="Red" />
</Border>

そして、これがどのように見えるかです:

ここに画像の説明を入力

長方形の形状 (つまり、完全な正方形ではない) の場合、角を同じサイズに保つために、RadiusX と RadiusY の値を適切にスケーリングする必要があります。幅と高さの比率に合わせてスケーリングする必要があります。

于 2014-01-03T18:29:01.530 に答える