4

UserControlのリストを表示するために使用しているを持っていUIElementます。コントロールは、水平方向に切り替えられたシングルItemsControlで構成され、によって公開されたものにバインドされ、のセットになります。 ItemPanelTemplateStackPanelItemsSourceDependencyPropertyUserControlItemTemplateUserControl.Resources

決して適用されないことを除いて、すべてが正常に機能し、ItemTemplate理由がわかりません。完全なソースは以下のとおりです。

UserControl.xaml-

<UserControl x:Name="UC" x:FieldModifier="private" x:Class="ContentSliderControl.ContentSlider"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.Resources>

    <DataTemplate x:Key="pageTemplate">
        <Border CornerRadius="10" Padding="5" Height="200" Width="200" Background="#333">
            <ContentControl Content="{Binding}"/>
        </Border>
    </DataTemplate>

    <ItemsPanelTemplate x:Key="template">
        <StackPanel IsItemsHost="True"
            Orientation="Horizontal"
            ScrollViewer.HorizontalScrollBarVisibility="Disabled"
            ScrollViewer.VerticalScrollBarVisibility="Disabled"/>
    </ItemsPanelTemplate>
</UserControl.Resources>

<ItemsControl ItemsPanel="{StaticResource template}" 
              ItemTemplate="{StaticResource pageTemplate}" 
              ItemsSource="{Binding ElementName=UC,Path=Pages}"/>

UserControl.xaml.cs-

[ContentProperty("Pages")]
public partial class ContentSlider : UserControl
{


    public List<UIElement> Pages
    {
        get { return (List<UIElement>)GetValue(PagesProperty); }
        //set { SetValue(PagesProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Pages.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty PagesProperty =
        DependencyProperty.Register("Pages", typeof(List<UIElement>), typeof(ContentSlider), new UIPropertyMetadata(null));



    public ContentSlider()
    {
        InitializeComponent();
    }
}

}

私はこのようにメインウィンドウのコントロールを消費します-

    <slider:ContentSlider >
    <slider:ContentSlider.Pages>
        <Button>1</Button>
        <Button>2</Button>
        <Button>3</Button>
        <Button>4</Button>
    </slider:ContentSlider.Pages>
</slider:ContentSlider>

ボタンは正常に表示されますが、200ピクセルの正方形の境界線の内側には表示されません。

どんな助けでも大いに活用されるでしょう。ありがとう。

4

5 に答える 5

6

Nirは正しく、UIElementsの場合はItemsControlアイテムを直接追加します。PanelMSDNでこの動作についての言及は見つかりませんでしたが、WPF博士はアイテムコンテナに関する彼の記事でそれについて言及しています。

UIElementが(ListBoxのような派生クラスのインスタンスではなく)明示的なItemsControlインスタンスのItemsコレクションに追加されると、アイテムパネルの直接の子になります。非UIElementが追加された場合、ContentPresenter内にラップされます。

あなたの解決策はおそらくListBox代わりにを使用ItemContainerStyleし、の新しいものに設定し、StyleそのListBoxItemスタイルでは、その中ControlTemplateであなたと一緒に使用するBorderことです。

于 2009-03-19T18:24:13.840 に答える
4

Nir は正しいです。このカスタム ItemsControl 実装は問題を解決し、独自の ItemTemplate を使用できるようにします。

public class ItemsControlForUIElement : ItemsControl
{
   protected override DependencyObject GetContainerForItemOverride()
   {
       return new ContentPresenter();
   }
   protected override bool IsItemItsOwnContainerOverride(object item)
   {
       return false;
   }
}
于 2009-08-11T03:37:00.933 に答える
4

これは UIElement のリストであるため、アイテム テンプレートは、アイテムを直接表示できない場合にのみ適用されます。

于 2009-03-19T11:41:42.927 に答える
2

ロバート・マクニーはその理由を頭に突き刺した。彼の解決策には、特定のシナリオではやり過ぎかもしれないコントロール テンプレートの使用が含まれます。または、 a ListBox-ItemContainerStyleを の新しいスタイルに設定しListBoxItem、そのスタイルでを で使用したい に設定します。ContentTemplateDataTemplateListBox ItemTemplate

于 2011-05-28T22:46:38.037 に答える
-1

DataTypeプロパティを設定すると、DataTemplate動作を開始します。

于 2009-03-20T17:51:34.893 に答える