0

VisibilitySwitchControl特定の条件で最初の子を表示する Windows 8 XAML を実装しました。それ以外の場合は、他のコントロールが表示されます。コードは次のとおりです。

[ContentProperty(Name = "Items")]
public class VisibilitySwitchControl : ItemsControl
{
    public VisibilitySwitchControl()
    {
        DefaultStyleKey = typeof(VisibilitySwitchControl);
        if (Items != null)
            Items.VectorChanged += OnItemsChanged;
    }

    public bool ShowFirst
    {
        get { return (bool)GetValue(ShowFirstProperty); }
        set { SetValue(ShowFirstProperty, value); }
    }

    public static readonly DependencyProperty ShowFirstProperty =
        DependencyProperty.Register("ShowFirst", typeof(bool), typeof(VisibilitySwitchControl), new PropertyMetadata(true, OnShowFirstChanged));

    public object VisibleContent
    {
        get { return GetValue(VisibleContentProperty); }
        private set { SetValue(VisibleContentProperty, value); }
    }

    public static readonly DependencyProperty VisibleContentProperty =
        DependencyProperty.Register("VisibleContent", typeof(object), typeof(VisibilitySwitchControl), new PropertyMetadata(null));

    private static void OnShowFirstChanged(DependencyObject d, DependencyPropertyChangedEventArgs args)
    {
        var visibilityItemsControl = d as VisibilitySwitchControl;
        if (visibilityItemsControl != null)
        {
            visibilityItemsControl.Evaluate();
        }
    }

    void OnItemsChanged(IObservableVector<object> sender, IVectorChangedEventArgs evt)
    {
        Evaluate();
    }

    void Evaluate()
    {
        if (Items != null && Items.Any())
        {
            var controls = Items.OfType<FrameworkElement>().ToList();
            for (var i = 0; i < controls.Count; i++)
            {
                if (i == 0)
                {
                    VisibleContent = controls[i];
                    controls[i].Visibility = ShowFirst ? Visibility.Visible : Visibility.Collapsed;
                }
                else
                {
                    controls[i].Visibility = !ShowFirst ? Visibility.Visible : Visibility.Collapsed;
                }
            }
        }
        else
        {
            VisibleContent = null;
        }
    }
}

ただし、 ListViewListView内に 2 つのコントロールを配置VisibilitySwitchControlすると、ページよりも大きくなり、スクロールバーが表示されなくなります。親コンテナーの境界を停止しません。

<custom:VisibilitySwitchControl ShowFirst="{Binding Path=IsFirstLevelNav}">
    <ListView x:Name="FirstListView"
            VerticalAlignment="Stretch" 
            ItemsSource="{Binding ...}"
            SelectedItem="{Binding ..., Mode=TwoWay}"
            ScrollViewer.VerticalScrollBarVisibility="Auto" 
            ScrollViewer.HorizontalScrollBarVisibility="Disabled"
            />
    <ListView x:Name="SecondListView"
            VerticalAlignment="Stretch" 
            ItemsSource="{Binding ...}"
            SelectedItem="{Binding ..., Mode=TwoWay}"
            ScrollViewer.VerticalScrollBarVisibility="Auto" 
            ScrollViewer.HorizontalScrollBarVisibility="Disabled"
            />
</custom:VisibilitySwitchControl>

VerticalAlignment="Stretch"子供たちの行動を強制するにはどうすればよいですか?コントロールを削除してリストを 1 つだけコードに直接配置すると、すべてが期待どおりに機能します。

提案をありがとう。

4

2 に答える 2

0

リストビューの高さを伸ばしたい場合は、親の実際の高さにバインドしてみてください

含める必要があるコード部分は次のとおりです

Height="{Binding ActualHeight, ElementName=parentContainer}"

は、使用してparentContainerいる の名前ですcustom:VisibilitySwitchControl。これにより、高さが親コンテナーのディスプレイの高さにバインドされます。試してみて、私に知らせてください

于 2013-09-24T06:51:02.000 に答える
0

1 つの ListView をスクロールし、最後に到達すると 2 番目の ListView が表示されるようにする場合は、VisibilitySwitchControl のスタイル内の ItemPresenter の周りに ScrollViewer を追加し、ListView ScrollViewer を無効にするだけです。ListView 内の仮想化が失われることを意味することに注意してください。

各 ListView が画面の半分を占めている場合、最も簡単な方法は 、ウィンドウの高さが変更されたときに更新するように各項目の高さを修正して登録することです (メモリ リークを防ぐために、アンロード時に登録を解除してください) Window.Current.Bounds.HeightWindow.Current.SizeChanged)。
もっと複雑だと思う別の方法は、VisibilitySwitchControl の ItemsPanel を別のものに変更することです (デフォルトでは Stack パネルであるため、画面よりも大きくなります)。たとえば、多くの持っているアイテムとして星の高さを含む行 (そして、各アイテムの行を設定する必要があります) またはカスタム パネルを作成することによって。

于 2013-09-23T22:15:28.017 に答える