1

PanoramaItemそこにあるいくつかの素晴らしいアプリに触発されて、パノラマに標準の幅よりも広いを入れたいと思っていPanoramaItemます。

LinkedIn のアプリでタイル付きのアイテムを表示します。

ここに画像の説明を入力

PanoramaItem通常、これは事前定義された幅のa を追加することで、xaml で実現されます。

<controls:PanoramaItem Width="555">

ただし、アプリケーションは Caliburn-Micro ベースであり、Panorama コントロールは便利な Cal​​iburn 規則を使用してデータ バインドされているため、この方法で UI をハードコーディングすることは避けたいと思います。その背後にあるビュー モデルはコンダクターであり、ページがインジェクトされます。コントロールはビュー モデルのプロパティにバインドPanoramaされます。Items

私の問題は、項目または画面の 1 つがパノラマ項目の標準幅よりも広い場合、切り取られることです。

ItemTemplate を指定して解決してみました:

<controls:Panorama.ItemTemplate>
    <DataTemplate>
        <ContentControl cal:View.Model="{Binding}"/>
    </DataTemplate>
</controls:Panorama.ItemTemplate>

しかし、それは何も変わりませんでした。

この問題をどのように解決しますか?

4

1 に答える 1

2

さて、問題は、どうやらできないということです。をオーバーライドOnViewAttachedして、動的にバインドされたコントロール ( ContentControl) の親を見つけようとしましたが、その親を取得できませんでした (PanoramaItemより広くしたかった )。

したがって、多くの試行錯誤の後、次の解決策に落ち着きました。

パノラマ アイテムを XAML で明示的に定義します。

<controls:PanoramaItem Header="item1">
    <ContentControl x:Name="Control1"/>
</controls:PanoramaItem>
<controls:PanoramaItem Header="Wide Item" Width="700" Orientation="Horizontal">
    <ContentControl x:Name="WideControl"/>
</controls:PanoramaItem>

それらは ViewModel にも注入され、ItemsCaliburn の から継承された のコレクションに追加されCunductorます。

次に、ViewModel が現在選択されている項目を認識していることを確認する必要があります。これにより、関連するビューが CaliburnMicro によってアクティブ化されます。

<controls:Panorama  Name="MainPanorama" 
    cal:Message.Attach="[Event SelectionChanged] = 
    [Action  MainPanorama_OnSelectionChanged($eventArgs)]" 
    SelectedIndex="{Binding ActivePage, Mode=TwoWay}">

また、ViewModel がSelectionChangedイベントを受け取るようにします。これにより、現在表示されているアイテムをいつアクティブにするかがわかります。

そして最後に、ViewModel ですべてを機能させるトリック:

public void MainPanorama_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ActivateItem(Items[ActivePage]);
}
于 2013-06-20T12:12:15.303 に答える