0

グリッド (WPF グリッド) 全体にグリッド (画面全体のボックスなど) を作成するために、装飾レイヤーを使用しています。

チェックボックスがマークされている場合にのみこれを表示したい。ただし、「IsEnabled」プロパティをバインドしても何も起こりません。IsEnabled を false に設定しても、グリッド オーバーレイは引き続き表示されます。

これは私の mainWindow.xaml から行う方法です。IsEnabled は false に設定されていますが、まだ表示されていることに注意してください。

<Grid>
        <!--Adornerdecorator is made to make sure the adorner is in the background, and not the foreground-->
        <AdornerDecorator>
          <View:GridWithRulerxaml IsEnabled="False" />
        </AdornerDecorator>
        <ItemsControl ItemsSource="{Binding Classes}"/>
        <ItemsControl ItemsSource="{Binding Edges}"/>
    </Grid>

これは装飾ユーザーコントロールです:

namespace UMLDesigner.View
{
/// <summary>
/// Interaction logic for GridWithRulerxaml.xaml
/// </summary>
public partial class GridWithRulerxaml : UserControl
{
    public GridWithRulerxaml()
    {
        InitializeComponent();

        //Loaded event is necessary as Adorner is null until control is shown.
        Loaded += GridWithRulerxaml_Loaded;

    }

    void GridWithRulerxaml_Loaded(object sender, RoutedEventArgs e)
    {
        var adornerLayer = AdornerLayer.GetAdornerLayer(this);
        var rulerAdorner = new AlignmentAdorner(this);
        adornerLayer.Add(rulerAdorner);
    }
}
}

そして最後に装飾者自身:

namespace UMLDesigner.Utilities
{
public class AlignmentAdorner : Adorner
{
    private FrameworkElement element;
    public AlignmentAdorner(UIElement el)
        : base(el)
    {
        element = el as FrameworkElement;
    }

    protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);

        double height = element.ActualHeight;
        double width = element.ActualWidth;

        double linesHorizontal = height / 50;
        double linesVertical = width / 50;

        var pen = new Pen(Brushes.LightGray, 1) { StartLineCap = PenLineCap.Triangle,     EndLineCap = PenLineCap.Triangle };

        int offset = 0;

        for (int i = 0; i <= linesVertical; ++i)
        {
            offset = offset + 50;
            drawingContext.DrawLine(pen, new Point(offset, 0), new Point(offset, height));
        }

        offset = 0;

        for (int i = 0; i <= linesHorizontal; ++i)
        {
            offset = offset + 50;
            drawingContext.DrawLine(pen, new Point(0, offset), new Point(width, offset));
        }
    }
}
}

ここで私を助けてくれることを本当に願っています。

4

1 に答える 1

0

IsEnabled プロパティは、要素との対話を有効または無効にするだけで、可視性とは関係ありません。

非表示にする場合は GridWithRulerxaml の Visibility プロパティを Collapsedまたは Hiddenに設定し、表示する場合は Visible に設定します。

編集: AdornerDecorator 内の GridWithRulerxaml ユーザー コントロールの可視性を Hidden に設定しても、アドナーは非表示になりません。

さらに考えてみると、これがあなたの望むものでない場合は、IsEnabled プロパティを使用して変更を監視し、値に応じて装飾を追加/削除することが可能かもしれません。

于 2013-12-12T21:43:11.340 に答える