1

受到一些很棒的应用程序的启发,我想PanoramaItem在我的全景图中有一个比PanoramaItem.

在 LinkedIn 的应用程序中查看带有磁贴的项目:

在此处输入图像描述

通常这是在 xaml 中通过添加PanoramaItem具有预定义宽度的 a 来实现的:

<controls:PanoramaItem Width="555">

但是,我想避免以这种方式对我的 UI 进行硬编码,因为该应用程序是基于 Caliburn-Micro 的,并且 Panorama 控件是使用方便的 Caliburn 约定进行数据绑定的。它背后的视图模型是一个导体,页面被注入其中。Panorama控件绑定到视图模型的属性Items

我的问题是,如果其中一个项目或屏幕比全景项目的标准宽度宽,它就会被剪裁。

我尝试通过指定 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 中并添加到Items继承自 Caliburn 的集合中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 回答