Avalonia에서 C#을 사용하여 Arch Linux에서 트레이 아이콘을 해결하고 UI 문제를 최소화하는 Touch001
private void MyMainWindow_PropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e)
{
if (sender is MainWindow && e.NewValue is WindowState windowState && windowState == WindowState.Minimized)
{
myMainWindow?.Hide();
}
}
이와 같이 더 쉬운 솔루션이 있어야한다고 느꼈습니다. 그래서 조금 더 구글링을 했습니다. 나는 그것을 시도할 수 있는 방법에 대한 Avalonion Gitter 게시물을 찾은 10페이지쯤에 Google에서 끝났습니다. 게시물은 HandleWindowStateChanged 메서드 재정의에 대해 설명했습니다. 그래서 해봤더니 제대로 되네요. 그래서 Endeavour Linux에서 시도해 보았고 쉽게 알아냈습니다. Linux에서 작업 표시줄 아이콘은 최소화 후에도 숨겨지지 않습니다. 또한 Windows 및 Linux에서 몇 가지 결함을 보았습니다. MainWindow로 돌아왔을 때 제대로 표시되지 않았습니다. 같은 게시물에서 몇 가지 메서드 호출을 제안했습니다. 나는 그것을 시도했고 두 플랫폼 모두에서 작동했습니다. Minimalize, Hide app 및 Hide Icon Bar에 대한 최종 코드는 아래와 같습니다. 언젠가 누군가에게 도움이 될 것입니다.
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
protected override void HandleWindowStateChanged(WindowState state)
{
if (state == WindowState.Minimized)
{
ShowInTaskbar = false;
Hide();
}
if(state == WindowState.Normal)
{
ShowInTaskbar = true;
this.BringIntoView();
Activate();
Focus();
base.HandleWindowStateChanged(state);
}
}
}
지금은 이 동작에 대한 테스트를 작성하는 방법을 모르지만 최소한 다음 Touch 기사가 될 수 있습니다.
이 시점에서 아직 트레이 아이콘에 대한 솔루션을 구현하지 않았습니다. 아발로니아 공식 웹페이지에서 아발로니아가 이미 트레이 아이콘을 지원한다는 것을 알았으므로 git의 일부 솔루션을 사용할 필요가 없습니다. 그러나 불행하게도 이것을 사용하는 방법에 대한 문서나 위키가 없었습니다. 그래서 실험해봤습니다.
결국 나는 이것과 비슷한 코드를 가졌습니다.
public partial class App : Application
{
private MainWindow? myMainWindow;
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}
public override void OnFrameworkInitializationCompleted()
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
myMainWindow = new MainWindow
{
DataContext = new MainWindowViewModel(),
};
desktop.MainWindow = myMainWindow;
RegisterTrayIcon();
}
base.OnFrameworkInitializationCompleted();
}
private void RegisterTrayIcon()
{
var trayIcon = new TrayIcon
{
IsVisible = true,
ToolTipText = "TestToolTipText",
Command = ReactiveCommand.Create(ShowApplication),
Icon = new WindowIcon("/Assets/avalonia-logo.ico")
};
}
private void ShowApplication()
{
if(myMainWindow != null)
{
myMainWindow.WindowState = WindowState.Normal;
myMainWindow.Show();
}
}
}
그리고 그것은 작동하지 않았습니다. 아래와 같이 손쉬운 명령 생성을 위해 ReactiveUI 라이브러리도 사용했습니다.
Command = ReactiveCommand.Create(ShowApplication),
또한 사용자가 트레이 아이콘을 클릭할 때 발생하는 동작을 구현하여 애플리케이션을 다시 표시합니다.
private void ShowApplication()
{
if(myMainWindow != null)
{
myMainWindow.WindowState = WindowState.Normal;
myMainWindow.Show();
}
}
아이콘을 로드할 때 런타임 중에 실패했습니다. 나는 이것을 위해 .ico를 사용할 수 없지만 투명한 png 이미지를 사용할 수 있다는 것을 알아 냈습니다. 그래서 Bitmap으로 로드한 다음 WindowIcon을 만들어야 했습니다. 그래서 이 줄을 아래 코드로 대체했습니다.
Icon = new WindowIcon(new Bitmap("C:/Icons/test.png"))
이 변경 후 코드가 올바르게 작동했습니다. 앱이 숨어 있었는데 트레이 아이콘을 클릭하면 다시 표시되었습니다. 하지만 응용 프로그램을 닫을 때 닫는 동안 실패했습니다. 운 좋게도이 순간에 발생한 예외는이 문제를 해결하는 데 도움이되었습니다. Attached 속성으로 Tray Icon 값을 설정하지 않았다는 것입니다. 그래서 구현했고 네, 두 플랫폼 모두에서 예상대로 작동합니다.
따라서 최종 코드는 아래와 같습니다. 기사 아래에 자유롭게 사용하고 의견을 말하십시오. 이것에 대해 어떻게 생각하세요?
public partial class App : Application
{
private MainWindow? myMainWindow;
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}
public override void OnFrameworkInitializationCompleted()
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
myMainWindow = new MainWindow
{
DataContext = new MainWindowViewModel(),
};
desktop.MainWindow = myMainWindow;
RegisterTrayIcon();
}
base.OnFrameworkInitializationCompleted();
}
private void RegisterTrayIcon()
{
var trayIcon = new TrayIcon
{
IsVisible = true,
ToolTipText = "TestToolTipText",
Command = ReactiveCommand.Create(ShowApplication),
Icon = new WindowIcon(new Bitmap("C:/Icons/test.png"))
};
var trayIcons = new TrayIcons
{
trayIcon
};
SetValue(TrayIcon.IconsProperty, trayIcons);
}
private void ShowApplication()
{
if(myMainWindow != null)
{
myMainWindow.WindowState = WindowState.Normal;
myMainWindow.Show();
}
}
}
Reference
이 문제에 관하여(Avalonia에서 C#을 사용하여 Arch Linux에서 트레이 아이콘을 해결하고 UI 문제를 최소화하는 Touch001), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/stipecmv/touch001-solving-tray-icon-and-minimalize-ui-problem-on-arch-linux-with-c-in-avalonia-1f2g텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)