سؤال

هل يعرف أحد أين يمكنني الحصول على عنصر تحكم مثل Multi-column Tree-View في WPF؟

هل كانت مفيدة؟

المحلول

ولقد نفذ هذا بناء على القديم بلوق وظيفة هنا . ولكن إذا كنت أتذكر الحق واضطررت الى القيام ببعض الأعمال اليدوية للحصول على الأشياء للعمل الصحيح. على وجه التحديد مع أشرطة التمرير.

ولكن هذا يجب أن تعطيك بداية جيدة.

نصائح أخرى

شارب ديفيلوب ديه فرعية ListView يسمى <لأ href = "HTTPS: // جيثب. كوم / icsharpcode / ILSpy / فقاعة / الماجستير / SharpTreeView / SharpTreeView.cs "يختلط =" نوفولو noreferrer "> SharpTreeView الذي يفعل ما كنت تبحث عنه.

ويمكنك ان ترى مثالا حيا على هذه السيطرة في نافذة شارب ديفيلوب في "رايتس ووتش":

وXAML المستخدمة في إطار المراقبة (كما هو الحال في 5.1.0 بيتا):

<tv:SharpGridView x:Key="variableGridView" AllowsColumnReorder="False">
    <GridView.Columns>
        <GridViewColumn Header="{core:Localize MainWindow.Windows.Debug.LocalVariables.NameColumn}" Width="200">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <tv:SharpTreeNodeView />
                        <local:AutoCompleteTextBox x:Name="name" Margin="-6 0 0 0"  MinWidth="100" Text="{Binding Node.Name}" IsEditable="{Binding Node.CanSetName}">
                            <local:AutoCompleteTextBox.ContextMenu>
                                <MultiBinding Converter="{StaticResource menuBuilder}">
                                    <Binding Path="Node.ContextMenuAddInTreeEntry" />
                                    <Binding Path="Node" />
                                </MultiBinding>
                            </local:AutoCompleteTextBox.ContextMenu>
                        </local:AutoCompleteTextBox>
                    </StackPanel>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="{core:Localize MainWindow.Windows.Debug.LocalVariables.ValueColumn}" Width="200">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <local:AutoCompleteTextBox
                        MinWidth="100"
                        Text="{Binding Node.Value}"
                        IsEditable="{Binding Node.CanSetValue}">
                        <local:AutoCompleteTextBox.ContextMenu>
                            <MultiBinding Converter="{StaticResource menuBuilder}">
                                <Binding Path="Node.ContextMenuAddInTreeEntry" />
                                <Binding Path="Node" />
                            </MultiBinding>
                        </local:AutoCompleteTextBox.ContextMenu>
                    </local:AutoCompleteTextBox>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="{core:Localize MainWindow.Windows.Debug.LocalVariables.TypeColumn}" Width="200">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <local:AutoCompleteTextBox MinWidth="100" Text="{Binding Node.Type}" IsEditable="False">
                        <local:AutoCompleteTextBox.ContextMenu>
                            <MultiBinding Converter="{StaticResource menuBuilder}">
                                <Binding Path="Node.ContextMenuAddInTreeEntry" />
                                <Binding Path="Node" />
                            </MultiBinding>
                        </local:AutoCompleteTextBox.ContextMenu>
                    </local:AutoCompleteTextBox>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
    </GridView.Columns>
</tv:SharpGridView>

ويتم تعيين المورد إلى خاصية عنصر تحكم SharpTreeView عرض.

وهناك مقال في codeproject التي قد تساعد:

http://www.codeproject.com/KB/WPF/TreeListView.aspx

وهناك عدد غير قليل من أخرى مفيدة <لأ href = "http://www.codeproject.com/info/search.aspx؟artkw=wpf+AND+treeview&sa_ao=False&sa_us=False&sa_so=17&pgnum=1" يختلط = " نوفولو noreferrer "> المواد هناك عن برنامج الأغذية العالمي تريفيف.

إذا لم تكن بحاجة إلى رؤوس الأعمدة، فهذا أمر سهل إلى حد ما.يمكنك فقط توفير قالب حاوية عنصر، وإضافة أعمدة شبكة ذات عرض ثابت إلى اليمين، وربطه بالبيانات ذات الصلة بعنصرك.

تحتوي حاوية العنصر الافتراضية لـ TreeView على شبكة محددة على النحو التالي (مع بعض التعليقات المضافة):

    <Grid>
        <Grid.ColumnDefinitions>
            <!--Expander--><ColumnDefinition MinWidth="19" Width="Auto"/>
            <!--Item--><ColumnDefinition Width="Auto"/>
            <!--Overflow--><ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <!--Current Item--><RowDefinition Height="Auto"/>
            <!--Sub-items--><RowDefinition/>
        </Grid.RowDefinitions>
        <ToggleButton x:Name="Expander" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ExpandCollapseToggleStyle}"/>
        <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="1" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
            <ContentPresenter x:Name="PART_Header" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
        </Border>
        <ItemsPresenter x:Name="ItemsHost" Grid.ColumnSpan="2" Grid.Column="1" Grid.Row="1"/>
    </Grid>

لذلك، قم فقط بتوسيع هذه الشبكة لتحتوي على أعمدة ذات عرض يمكن التنبؤ به إلى اليمين، وسيكون لديك أعمدة.

  • أضف تعريف العمود للعمود الجديد، واجعله بحجم تلقائي
  • قم بتحديث نطاق عمود "ItemsHost" ليشمل العمود المضاف
  • أضف عنصر تحكم العرض المتوقع إلى هذا العمود:

الأجزاء المتضررة:

<Grid>
...
   <ColumnDefinition Width="Auto"/>
...
   <ItemsPresenter ... Grid.ColumnSpan="3" ... />
...
   <Border Grid.Column="3"><!--Add column data here--></Border>
...
</Grid>

إذا كان الحد المضاف هو نفس العرض لجميع الصفوف، فسيكون لديك طريقة عرض تشبه عرض الشجرة مع الأعمدة.من الواضح أن هذا لن يتوسع بشكل جيد، ولكن إذا كنت تحتاج فقط إلى حل سريع وقذر، فيجب أن تكون قادرًا على القيام بذلك بشكل مختلط في بضع دقائق دون إضافة تبعيات لعناصر التحكم/المكتبات الخارجية.

نمت احتياجاتنا بسرعة وأضفنا شبكة تحتوي على تسميات أعمدة خارج الشجرة وقمنا بربط عرض الأعمدة هناك بعرض هذه "الأعمدة" [في الواقع عرض عنصر التحكم الممتد في الأعمدة المعنية باستخدام أعمدة ذات حجم تلقائي].إنه يعمل، وهذا كل ما سأقوله دفاعًا عنه.

يمكن أيضًا تنفيذ هذا الأسلوب في قالب العنصر الذي تم إنشاؤه بدلاً من حاوية العنصر إذا كنت لا تمانع (أو تريد) أن يمتد مربع التحديد (الحدود "Bd") عبر جميع الأعمدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top