mirror of
https://gitcode.com/gh_mirrors/se/Semi.Avalonia
synced 2026-03-03 00:00:55 +08:00
Merge pull request #669 from irihitech/trayicon
Designed a new TrayIcon and NativeMenu for macOS
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 717 B |
@@ -14,9 +14,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<AndroidResource Include="Icon.png">
|
<AndroidResource Include="Icon.png" Link="Resources\drawable\Icon.png"/>
|
||||||
<Link>Resources\drawable\Icon.png</Link>
|
|
||||||
</AndroidResource>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
|
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
|
||||||
|
<ApplicationIcon>..\Semi.Avalonia.Demo\Assets\irihi.ico</ApplicationIcon>
|
||||||
<!-- Uncomment below to enable Native AOT compilation-->
|
<!-- Uncomment below to enable Native AOT compilation-->
|
||||||
<!--<PublishAot>true</PublishAot>-->
|
<!--<PublishAot>true</PublishAot>-->
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
|
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
|
||||||
|
<ApplicationIcon>..\Semi.Avalonia.Demo\Assets\irihi.ico</ApplicationIcon>
|
||||||
<!-- Uncomment below to enable Native AOT compilation-->
|
<!-- Uncomment below to enable Native AOT compilation-->
|
||||||
<!--<PublishAot>true</PublishAot>-->
|
<!--<PublishAot>true</PublishAot>-->
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<Application
|
<Application
|
||||||
|
Name="Semi Avalonia Demo"
|
||||||
x:Class="Semi.Avalonia.Demo.App"
|
x:Class="Semi.Avalonia.Demo.App"
|
||||||
xmlns="https://github.com/avaloniaui"
|
xmlns="https://github.com/avaloniaui"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
@@ -19,12 +20,30 @@
|
|||||||
</ResourceDictionary.MergedDictionaries>
|
</ResourceDictionary.MergedDictionaries>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
</Application.Resources>
|
</Application.Resources>
|
||||||
|
<NativeMenu.Menu>
|
||||||
|
<NativeMenu>
|
||||||
|
<NativeMenuItem
|
||||||
|
Header="About Us"
|
||||||
|
Command="{Binding JumpToCommand}"
|
||||||
|
CommandParameter="{Binding $self.Header}" />
|
||||||
|
</NativeMenu>
|
||||||
|
</NativeMenu.Menu>
|
||||||
<TrayIcon.Icons>
|
<TrayIcon.Icons>
|
||||||
<TrayIcons>
|
<TrayIcons>
|
||||||
<TrayIcon Icon="/Assets/irihi.ico" MacOSProperties.IsTemplateIcon="true" ToolTipText="Semi Avalonia Demo">
|
<TrayIcon
|
||||||
|
Icon="{OnPlatform Default=/Assets/irihi.ico, macOS=/Assets/irihi2.ico}"
|
||||||
|
MacOSProperties.IsTemplateIcon="true"
|
||||||
|
Command="{Binding ActivateCommand}"
|
||||||
|
ToolTipText="Semi Avalonia Demo">
|
||||||
<TrayIcon.Menu>
|
<TrayIcon.Menu>
|
||||||
<NativeMenu>
|
<NativeMenu>
|
||||||
<NativeMenuItem Header="Exit" Command="{Binding ExitCommand}" />
|
<NativeMenuItem
|
||||||
|
Header="About Us"
|
||||||
|
Command="{Binding JumpToCommand}"
|
||||||
|
CommandParameter="{Binding $self.Header}" />
|
||||||
|
<NativeMenuItem
|
||||||
|
Header="Exit"
|
||||||
|
Command="{Binding ExitCommand}" />
|
||||||
</NativeMenu>
|
</NativeMenu>
|
||||||
</TrayIcon.Menu>
|
</TrayIcon.Menu>
|
||||||
</TrayIcon>
|
</TrayIcon>
|
||||||
|
|||||||
BIN
demo/Semi.Avalonia.Demo/Assets/irihi2.ico
Normal file
BIN
demo/Semi.Avalonia.Demo/Assets/irihi2.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 948 B |
@@ -1,12 +1,37 @@
|
|||||||
using Avalonia;
|
using Avalonia;
|
||||||
|
using Avalonia.Controls;
|
||||||
using Avalonia.Controls.ApplicationLifetimes;
|
using Avalonia.Controls.ApplicationLifetimes;
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
using CommunityToolkit.Mvvm.Input;
|
using CommunityToolkit.Mvvm.Input;
|
||||||
|
using CommunityToolkit.Mvvm.Messaging;
|
||||||
|
|
||||||
namespace Semi.Avalonia.Demo.ViewModels;
|
namespace Semi.Avalonia.Demo.ViewModels;
|
||||||
|
|
||||||
public partial class ApplicationViewModel : ObservableObject
|
public partial class ApplicationViewModel : ObservableObject
|
||||||
{
|
{
|
||||||
|
[RelayCommand]
|
||||||
|
private void Activate()
|
||||||
|
{
|
||||||
|
if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop) return;
|
||||||
|
var mainWindow = desktop.MainWindow;
|
||||||
|
if (mainWindow is not null && !mainWindow.IsActive)
|
||||||
|
{
|
||||||
|
if (mainWindow.WindowState is WindowState.Minimized)
|
||||||
|
{
|
||||||
|
mainWindow.WindowState = WindowState.Normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
mainWindow.Activate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[RelayCommand]
|
||||||
|
private void JumpTo(string header)
|
||||||
|
{
|
||||||
|
Activate();
|
||||||
|
WeakReferenceMessenger.Default.Send(header, "JumpTo");
|
||||||
|
}
|
||||||
|
|
||||||
[RelayCommand]
|
[RelayCommand]
|
||||||
private void Exit()
|
private void Exit()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ using Avalonia.Controls.ApplicationLifetimes;
|
|||||||
using Avalonia.Styling;
|
using Avalonia.Styling;
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
using CommunityToolkit.Mvvm.Input;
|
using CommunityToolkit.Mvvm.Input;
|
||||||
|
using CommunityToolkit.Mvvm.Messaging;
|
||||||
|
|
||||||
namespace Semi.Avalonia.Demo.Views;
|
namespace Semi.Avalonia.Demo.Views;
|
||||||
|
|
||||||
@@ -18,6 +19,19 @@ public partial class MainView : UserControl
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.DataContext = new MainViewModel();
|
this.DataContext = new MainViewModel();
|
||||||
|
WeakReferenceMessenger.Default.Register<string, string>(this, "JumpTo", MessageHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MessageHandler(object _, string message)
|
||||||
|
{
|
||||||
|
foreach (var item in tab.ItemsView)
|
||||||
|
{
|
||||||
|
if (item is TabItem tabItem && tabItem.Header is not null && tabItem.Header.Equals(message))
|
||||||
|
{
|
||||||
|
tab.SelectedItem = tabItem;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,4 +247,4 @@ public class MenuItemViewModel
|
|||||||
public ICommand? Command { get; set; }
|
public ICommand? Command { get; set; }
|
||||||
public object? CommandParameter { get; set; }
|
public object? CommandParameter { get; set; }
|
||||||
public IList<MenuItemViewModel>? Items { get; set; }
|
public IList<MenuItemViewModel>? Items { get; set; }
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user