Skip to content

Commit ba9a2e2

Browse files
committed
Merge branch 'master' into develop
2 parents 08c5312 + 48ba201 commit ba9a2e2

File tree

12 files changed

+127
-28
lines changed

12 files changed

+127
-28
lines changed

Changelog.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@
6969
- Selecting an `RibbonTabItem` brings it into view now
7070
- Improved keyboard navigation inside `BackstageTabControl`
7171
- Improved mouse wheel selection on `RibbonTabControl`
72+
- `DropDownButton`
73+
- Added support for `UsesItemContainerTemplate` and `ItemContainerTemplateSelector`
74+
- `MenuItem`
75+
- Added support for `UsesItemContainerTemplate` and `ItemContainerTemplateSelector`
76+
- `IsSplit` is now automatically set by a style trigger. If `Command` is not null and `HasItems` is true.
77+
- `RibbonMenu`
78+
- Added support for `UsesItemContainerTemplate` and `ItemContainerTemplateSelector`
7279

7380
- ### Bug fixes
7481

Directory.packages.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Project>
22
<ItemGroup>
3-
<PackageVersion Include="ControlzEx" version="7.0.0-alpha0106" />
3+
<PackageVersion Include="ControlzEx" version="7.0.0-rc0118" />
44
<PackageVersion Include="System.Memory" Version="4.5.5" />
55
</ItemGroup>
66

@@ -15,7 +15,7 @@
1515

1616
<PackageVersion Include="NUnit" version="4.1.0" />
1717

18-
<PackageVersion Include="System.Text.Json" version="8.0.4" />
18+
<PackageVersion Include="System.Text.Json" version="8.0.5" />
1919

2020
<!--<PackageVersion Include="Google.Cloud.Translate.V3" Version="2.4.0" />-->
2121
</ItemGroup>

Fluent.Ribbon.Showcase/TestContent.xaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,6 @@
558558
<Separator />
559559
<Fluent:MenuItem Header="Set Default Paste..."
560560
Command="Paste"
561-
IsSplit="True"
562561
KeyTip="A">
563562
<Fluent:MenuItem Header="1"
564563
Click="OnMenuItemClick" />

Fluent.Ribbon/Controls/DropDownButton.cs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,64 @@ public override void OnApplyTemplate()
482482

483483
#region Overrides
484484

485+
/// <summary>Gets or sets the custom logic for choosing a template used to display each item.</summary>
486+
/// <returns>A custom object that provides logic and returns an item container.</returns>
487+
public ItemContainerTemplateSelector? ItemContainerTemplateSelector
488+
{
489+
get => (ItemContainerTemplateSelector?)this.GetValue(StatusBar.ItemContainerTemplateSelectorProperty);
490+
set => this.SetValue(StatusBar.ItemContainerTemplateSelectorProperty, value);
491+
}
492+
493+
/// <summary>Gets or sets a value that indicates whether the menu selects different item containers, depending on the type of the item in the underlying collection or some other heuristic.</summary>
494+
/// <returns>
495+
/// <see langword="true" /> the menu selects different item containers; otherwise, <see langword="false" />.
496+
///
497+
/// The registered default is <see langword="false" />. For more information about what can influence the value, see Dependency Property Value Precedence.</returns>
498+
public bool UsesItemContainerTemplate
499+
{
500+
get => (bool)this.GetValue(StatusBar.UsesItemContainerTemplateProperty);
501+
set => this.SetValue(StatusBar.UsesItemContainerTemplateProperty, value);
502+
}
503+
504+
private object? currentItem;
505+
506+
/// <inheritdoc />
507+
protected override bool IsItemItsOwnContainerOverride(object item)
508+
{
509+
if (base.IsItemItsOwnContainerOverride(item))
510+
{
511+
return true;
512+
}
513+
514+
if (this.UsesItemContainerTemplate)
515+
{
516+
this.currentItem = item;
517+
}
518+
519+
return false;
520+
}
521+
522+
/// <inheritdoc />
523+
protected override DependencyObject GetContainerForItemOverride()
524+
{
525+
if (this.UsesItemContainerTemplate is false)
526+
{
527+
this.currentItem = null;
528+
return base.GetContainerForItemOverride();
529+
}
530+
531+
var item = this.currentItem;
532+
this.currentItem = null;
533+
534+
var dataTemplate = this.ItemContainerTemplateSelector?.SelectTemplate(item, this);
535+
if (dataTemplate is not null)
536+
{
537+
return dataTemplate.LoadContent();
538+
}
539+
540+
return base.GetContainerForItemOverride();
541+
}
542+
485543
private void OnDropDownPopupKeyDown(object sender, KeyEventArgs e)
486544
{
487545
if (e.Handled)

Fluent.Ribbon/Controls/MenuItem.cs

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -410,16 +410,43 @@ public void OnKeyTipBack()
410410

411411
#region Overrides
412412

413+
private object? currentItem;
414+
413415
/// <inheritdoc />
414-
protected override DependencyObject GetContainerForItemOverride()
416+
protected override bool IsItemItsOwnContainerOverride(object item)
415417
{
416-
return new MenuItem();
418+
if (item is MenuItem or Separator)
419+
{
420+
return true;
421+
}
422+
423+
if (this.UsesItemContainerTemplate)
424+
{
425+
this.currentItem = item;
426+
}
427+
428+
return false;
417429
}
418430

419431
/// <inheritdoc />
420-
protected override bool IsItemItsOwnContainerOverride(object item)
432+
protected override DependencyObject GetContainerForItemOverride()
421433
{
422-
return item is FrameworkElement;
434+
if (this.UsesItemContainerTemplate is false)
435+
{
436+
this.currentItem = null;
437+
return new MenuItem();
438+
}
439+
440+
var item = this.currentItem;
441+
this.currentItem = null;
442+
443+
var dataTemplate = this.ItemContainerTemplateSelector.SelectTemplate(item, this);
444+
if (dataTemplate is not null)
445+
{
446+
return dataTemplate.LoadContent();
447+
}
448+
449+
return new MenuItem();
423450
}
424451

425452
#region Non MenuBase ItemsControl workarounds

Fluent.Ribbon/Controls/RibbonMenu.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,12 @@ static RibbonMenu()
2626
/// <inheritdoc />
2727
protected override DependencyObject GetContainerForItemOverride()
2828
{
29-
return new MenuItem();
30-
}
29+
if (this.UsesItemContainerTemplate)
30+
{
31+
return base.GetContainerForItemOverride();
32+
}
3133

32-
/// <inheritdoc />
33-
protected override bool IsItemItsOwnContainerOverride(object item)
34-
{
35-
return item is System.Windows.Controls.MenuItem or Separator;
34+
return new MenuItem();
3635
}
3736

3837
#endregion

Fluent.Ribbon/Themes/Controls/Button.xaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
1616
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
1717
RecognizesAccessKey="True"
18-
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
19-
Opacity=".75" />
18+
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
2019
</Grid>
2120
<ControlTemplate.Triggers>
21+
<DataTrigger Binding="{Binding Path=IsActive, RelativeSource={RelativeSource AncestorType=Window}}" Value="False">
22+
<Setter TargetName="contentPresenter" Property="Opacity" Value="0.75" />
23+
</DataTrigger>
2224
<Trigger Property="IsMouseOver" Value="True">
2325
<Setter TargetName="contentPresenter" Property="Opacity" Value="1" />
2426
</Trigger>

Fluent.Ribbon/Themes/Controls/InRibbonGallery.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@
449449
BorderBrush="{DynamicResource Fluent.Ribbon.Brushes.Control.Border}"
450450
BorderThickness="1 1 1 1"
451451
ClipToBounds="True">
452-
<Grid Background="{DynamicResource Fluent.Ribbon.Brushes.White}">
452+
<Grid Background="{DynamicResource Fluent.Ribbon.Brushes.InRibbonGallery.Content.Background}">
453453
<ScrollViewer x:Name="ScrollViewer"
454454
Style="{DynamicResource Fluent.Ribbon.Styles.ScrollViewer}"
455455
Fluent:ScrollViewerAttachedProperties.ScrollBarStyle="{DynamicResource Fluent.Ribbon.Styles.InRibbonGallery.ScrollBar}"

Fluent.Ribbon/Themes/Controls/MenuItem.xaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,13 @@
452452
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
453453
<Setter Property="Template" Value="{DynamicResource Fluent.Ribbon.Templates.MenuItem}" />
454454
<Style.Triggers>
455+
<MultiDataTrigger>
456+
<MultiDataTrigger.Conditions>
457+
<Condition Binding="{Binding Command, RelativeSource={RelativeSource Self}, Converter={x:Static converters:IsNullConverter.Instance}}" Value="False" />
458+
<Condition Binding="{Binding HasItems, RelativeSource={RelativeSource Self}}" Value="True" />
459+
</MultiDataTrigger.Conditions>
460+
<Setter Property="Fluent:MenuItem.IsSplit" Value="True" />
461+
</MultiDataTrigger>
455462
<MultiTrigger>
456463
<MultiTrigger.Conditions>
457464
<Condition Property="Fluent:MenuItem.IsSplit" Value="True" />

Fluent.Ribbon/Themes/Controls/RibbonScrollViewer.xaml

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -286,14 +286,11 @@
286286

287287
<Style x:Key="Fluent.Ribbon.Styles.ScrollViewer"
288288
TargetType="{x:Type ScrollViewer}">
289+
<Setter Property="Focusable" Value="False" />
290+
<Setter Property="OverridesDefaultStyle" Value="True" />
291+
289292
<Setter Property="Fluent:ScrollViewerAttachedProperties.ScrollBarStyle" Value="{DynamicResource Fluent.Ribbon.Styles.ScrollBarWhite}" />
290293
<Setter Property="Template" Value="{DynamicResource Fluent.Ribbon.Templates.ScrollViewer}" />
291-
292-
<Style.Triggers>
293-
<Trigger Property="IsEnabled" Value="False">
294-
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
295-
</Trigger>
296-
</Style.Triggers>
297294
</Style>
298295

299296
<Style x:Key="Fluent.Ribbon.Styles.RibbonGroupsContainerScrollViewer"

0 commit comments

Comments
 (0)