2016-12-21 2 views
0

他のコントロールをオーバーレイするのに使用できるWPFカスタムコントロールを開発しようとしています。使用できないことを明確にするために効果的にディミングします。これは、ポップアップが表示されたときに背景ページがグレー表示される、多くのWebサイトに表示される効果に似ています。カスタムコントロールが正しく表示されない

問題が発生すると、含まれているコントロールが薄暗く表示されるのではなく、消えてしまいます。以下のコードを非常に簡単なサンプルの使用法と共に示します。ここで

は...

public class OverlayDisableControl : UserControl { 
    protected override void OnInitialized(EventArgs e) { 
    base.OnInitialized(e); 

    VerticalAlignment = VerticalAlignment.Stretch; 
    HorizontalAlignment = HorizontalAlignment.Stretch; 

    Grid grid = new Grid(); 

    ContentPresenter content = new ContentPresenter { 
     Name = "content", 
     Content = Content 
    }; 
    grid.Children.Add(content); 

    Grid overlay = new Grid { 
     Name = "Overlay", 
     Visibility = Visibility.Collapsed 
    }; 

    Border background = new Border { 
     Name = "background", 
     VerticalAlignment = VerticalAlignment.Stretch, 
     HorizontalAlignment = HorizontalAlignment.Stretch, 
     Background = new SolidColorBrush(Colors.LightGray), 
     Opacity = .6 
    }; 
    overlay.Children.Add(background); 

    grid.Children.Add(overlay); 

    Content = grid; 
    } 

    public static readonly DependencyProperty OverlayVisibleProperty = 
      DependencyProperty.Register("OverlayVisible", typeof(bool), 
      typeof(OverlayDisableControl), 
      new FrameworkPropertyMetadata(SetOverlayVisibleStatic)); 

    public bool OverlayVisible { 
    get { 
     return (bool) GetValue(OverlayVisibleProperty); 
    } 
    set { 
     SetValue(OverlayVisibleProperty, value); 
    } 
    } 

    private static void SetOverlayVisibleStatic(DependencyObject d, DependencyPropertyChangedEventArgs e) { 
    (d as OverlayDisableControl).SetOverlayVisible(d as OverlayDisableControl, (bool) e.NewValue); 
    } 

    private void SetOverlayVisible(OverlayDisableControl odc, bool visible) { 
    if (visible) { 
     DoubleAnimation anim = new DoubleAnimation { 
     From = 0, 
     To = 1, // Visible 
     Duration = new Duration(TimeSpan.FromMilliseconds(350)), 
     EasingFunction = new QuadraticEase { 
      EasingMode = EasingMode.EaseInOut 
     } 
     }; 
     odc.Visibility = Visibility.Visible; 
     odc.BeginAnimation(OpacityProperty, anim); 
    } else { 
     DoubleAnimation anim = new DoubleAnimation { 
     From = 1, 
     To = 0, // Invisible 
     Duration = new Duration(TimeSpan.FromMilliseconds(350)), 
     EasingFunction = new QuadraticEase { 
      EasingMode = EasingMode.EaseInOut 
     } 
     }; 
     anim.Completed += (s1, e1) => { 
     odc.Visibility = Visibility.Collapsed; 
     }; 
     odc.BeginAnimation(OpacityProperty, anim); 
    } 
    } 
} 

コントロール自体(名前空間と空間のビットを節約するために省略usings)のためのコードである...と、ここで使用例です。これはあなたが必要とするすべてのもので、コードビハインドなしで、これをウィンドウにドロップするだけです。 GroupBox内のコントロールはちょうどテスティングのためにそこにあります...

<Grid> 
    <Grid.RowDefinitions> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <StackPanel Orientation="Horizontal"> 
    <CheckBox Content="Show?" 
       Margin="3" 
       Name="ShowChk" 
       IsChecked="True" /> 
    </StackPanel> 
    <local:OverlayDisableControl OverlayVisible="{Binding ElementName=ShowChk, Path=IsChecked, Mode=TwoWay}" 
           Grid.Row="1"> 
    <GroupBox Header="Gratuitous controls" 
       Margin="3"> 
     <StackPanel Orientation="Vertical"> 
     <TextBlock Text="This is some text" 
        Margin="3" /> 
     <TextBox Margin="3" /> 
     <Button Content="Save" 
       Margin="3" /> 
     </StackPanel> 
    </GroupBox> 
    </local:OverlayDisableControl> 
</Grid> 

誰かが私が間違っていたことは何ですか?

+0

なぜあなたはそれがコントロールが存在するコンテナを無効にするのではなく、そのようにしますか? –

+0

@ rory.apコンテナを無効にしようとしましたが、同じ印象を与えませんでした。また、私はこれが働いているとき、私は、メッセージを表示するオーバーレイにテキストブロックを追加したい、私はコンテナを無効にすることはできません。しかし、提案をありがとう。 –

答えて

1

UserControlの表示/非表示を変更していますが、その後はGrid overlayです。あなたのコードに

変更:

public class OverlayDisableControl : UserControl 
{ 
    private Grid overlay = new Grid 
    { 
     Name = "Overlay", 
     Visibility = Visibility.Collapsed 
    }; 

    protected override void OnInitialized(EventArgs e) 
    { 
     base.OnInitialized(e); 

     ... 

     //Grid overlay = new Grid 
     //{ 
     // Name = "Overlay", 
     // Visibility = Visibility.Collapsed 
     //}; 

     ... 

    } 

    ... 

    private static void SetOverlayVisibleStatic(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     (d as OverlayDisableControl).SetOverlayVisible((bool)e.NewValue); 
    } 

    private void SetOverlayVisible(bool visible) 
    { 
     if (visible) 
     { 
      DoubleAnimation anim = new DoubleAnimation 
      { 
       ... 
      }; 
      overlay.Visibility = Visibility.Visible; 
      overlay.BeginAnimation(OpacityProperty, anim); 
     } 
     else 
     { 
      DoubleAnimation anim = new DoubleAnimation 
      { 
       ... 
      }; 
      anim.Completed += (s1, e1) => { 
       overlay.Visibility = Visibility.Collapsed; 
      }; 
      overlay.BeginAnimation(OpacityProperty, anim); 
     } 
    } 
} 
+1

ありがとうございます。他の誰かがそれらを指摘するまで、明らかな事柄が完全に見えないことがあります。 –

関連する問題