Неполный ControlTemplate ComboBox`а в .NET 4.0
От: romakoma Интернет  
Дата: 07.09.19 18:21
Оценка:
Нужно убрать стрелочку из ComboBox и с этой целью пытаюсь получить стандартный ControlTemplate и сделать в нём соответсвующие изменения. Но проблема в том что Visual studio 2015 для проекта под .NET 4.0 и .NET 4.0 client profile выдаёт неполный шаблон ComboBox. А вот для проектов под остальные версии .NET шаблон полный. При попытке использования шаблона вылезает ошибка InvalidOperationException: Must have non-null value for 'Property'.. И вот тако Stack trace:
   at System.Windows.Condition.Seal(ValueLookupType type)
   at System.Windows.ConditionCollection.Seal(ValueLookupType type)
   at System.Windows.MultiTrigger.Seal()
   at System.Windows.TriggerCollection.Seal()
   at System.Windows.StyleHelper.SealTemplate(FrameworkTemplate frameworkTemplate, Boolean& isSealed, FrameworkElementFactory templateRoot, TriggerCollection triggers, ResourceDictionary resources, HybridDictionary childIndexFromChildID, FrugalStructList`1& childRecordFromChildIndex, FrugalStructList`1& triggerSourceRecordFromChildIndex, FrugalStructList`1& containerDependents, FrugalStructList`1& resourceDependents, ItemStructList`1& eventDependents, HybridDictionary& triggerActions, HybridDictionary& dataTriggerRecordFromBinding, Boolean& hasInstanceValues, EventHandlersStore& eventHandlersStore)
   at System.Windows.FrameworkTemplate.Seal()
   at System.Windows.Controls.Control.OnTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
   at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
   at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
wpf xaml
Re: Неполный ControlTemplate ComboBox`а в .NET 4.0
От: barn_czn  
Дата: 09.09.19 07:20
Оценка:
Здравствуйте, romakoma, Вы писали:

R>Нужно убрать стрелочку из ComboBox и с этой целью пытаюсь получить стандартный ControlTemplate и сделать в нём соответсвующие изменения.


ради стрелочки менять Template? ни проще по визуальному дереву добраться и изменить? Visibility.Hide выставить например. И этот хак оформить даже в виде Behavior или атачед проперти
Re: Неполный ControlTemplate ComboBox`а в .NET 4.0
От: Mr.Delphist  
Дата: 09.09.19 09:53
Оценка:
Здравствуйте, romakoma, Вы писали:

R>Нужно убрать стрелочку из ComboBox и с этой целью пытаюсь получить стандартный ControlTemplate и сделать в нём соответсвующие изменения. Но проблема в том что Visual studio 2015 для проекта под .NET 4.0 и .NET 4.0 client profile выдаёт неполный шаблон ComboBox. А вот для проектов под остальные версии .NET шаблон полный.


Blend можно попробовать — он как-то получше умеет в XAML Templates.
Ну или поискать сырцы C# 4.0 — там можно пошарить на тему дефолтного темплейта для нужного контрола.
Re[2]: Неполный ControlTemplate ComboBox`а в .NET 4.0
От: romakoma Интернет  
Дата: 14.09.19 10:36
Оценка:
Здравствуйте, barn_czn, Вы писали:

_>Здравствуйте, romakoma, Вы писали:


R>>Нужно убрать стрелочку из ComboBox и с этой целью пытаюсь получить стандартный ControlTemplate и сделать в нём соответсвующие изменения.


_>ради стрелочки менять Template? ни проще по визуальному дереву добраться и изменить? Visibility.Hide выставить например. И этот хак оформить даже в виде Behavior или атачед проперти

Наверное проще. Не думал об этом.
Re[2]: Неполный ControlTemplate ComboBox`а в .NET 4.0
От: romakoma Интернет  
Дата: 14.09.19 11:29
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Здравствуйте, romakoma, Вы писали:


R>>Нужно убрать стрелочку из ComboBox и с этой целью пытаюсь получить стандартный ControlTemplate и сделать в нём соответсвующие изменения. Но проблема в том что Visual studio 2015 для проекта под .NET 4.0 и .NET 4.0 client profile выдаёт неполный шаблон ComboBox. А вот для проектов под остальные версии .NET шаблон полный.


MD>Blend можно попробовать — он как-то получше умеет в XAML Templates.

MD>Ну или поискать сырцы C# 4.0 — там можно пошарить на тему дефолтного темплейта для нужного контрола.

Не нашёл.
Re: Неполный ControlTemplate ComboBox`а в .NET 4.0
От: romakoma Интернет  
Дата: 14.09.19 11:46
Оценка:
Здравствуйте, romakoma, Вы писали:

R>Нужно убрать стрелочку из ComboBox и с этой целью пытаюсь получить стандартный ControlTemplate и сделать в нём соответсвующие изменения. Но проблема в том что Visual studio 2015 для проекта под .NET 4.0 и .NET 4.0 client profile выдаёт неполный шаблон ComboBox. А вот для проектов под остальные версии .NET шаблон полный. При попытке использования шаблона вылезает ошибка InvalidOperationException: Must have non-null value for 'Property'.. И вот тако Stack trace:

R>
R>   at System.Windows.Condition.Seal(ValueLookupType type)
R>   at System.Windows.ConditionCollection.Seal(ValueLookupType type)
R>   at System.Windows.MultiTrigger.Seal()
R>   at System.Windows.TriggerCollection.Seal()
R>   at System.Windows.StyleHelper.SealTemplate(FrameworkTemplate frameworkTemplate, Boolean& isSealed, FrameworkElementFactory templateRoot, TriggerCollection triggers, ResourceDictionary resources, HybridDictionary childIndexFromChildID, FrugalStructList`1& childRecordFromChildIndex, FrugalStructList`1& triggerSourceRecordFromChildIndex, FrugalStructList`1& containerDependents, FrugalStructList`1& resourceDependents, ItemStructList`1& eventDependents, HybridDictionary& triggerActions, HybridDictionary& dataTriggerRecordFromBinding, Boolean& hasInstanceValues, EventHandlersStore& eventHandlersStore)
R>   at System.Windows.FrameworkTemplate.Seal()
R>   at System.Windows.Controls.Control.OnTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
R>   at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
R>   at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
R>   at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
R>   at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
R>   at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
R>   at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
R>

Скачал другой образ Windows 7, переустановил ОС, запустил Blend. На этот раз для проекта под .NET 4 Blend сгенерировал полный шаблон, но с ошибкой вот здесь:
<ControlTemplate x:Key="ComboBoxControlTemplate1" TargetType="{x:Type ComboBox}">
  …
  <ControlTemplate.Triggers>
    <MultiTrigger>
        <MultiTrigger.Conditions>
            <Condition Property="IsGrouping" Value="True"/>
            <Condition>
                <Condition.Value>
                    <System:Boolean>False</System:Boolean>
                </Condition.Value>
            </Condition>
        </MultiTrigger.Conditions>
        <Setter Property="ScrollViewer.CanContentScroll" Value="False"/>
    </MultiTrigger>
  </ControlTemplate.Triggers>
  …
</ControlTemplate>

Если этот код закоментировать либо заменить на
<Trigger Property="ItemsControl.IsGrouping">
    <Setter Property="ScrollViewer.CanContentScroll">
        <Setter.Value>
            <s:Boolean>False</s:Boolean>
        </Setter.Value>
    </Setter>
    <Trigger.Value>
        <s:Boolean>True</s:Boolean>
    </Trigger.Value>
</Trigger>

то всё равботает.
wpf xaml
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.