Изменение значка строки заголовка в скрипте Powershell со встроенным XAML GUI - PullRequest
0 голосов
/ 10 января 2020

это мой первый пост. Я пишу приложение для запуска скриптов в Powershell со встроенным XAML-кодом для GUI. XAML был обработан в Visual Studio, затем экспортирован в Powershell и настроен вручную. Простой и понятный, но я застрял, пытаясь изменить значок в строке заголовка приложения. Изменение значка - это необходимость внутреннего брендинга.

Общий значок c Powershell появляется в строке заголовка моего приложения. И я думаю, что я пытался адаптировать каждую технику XAML и метода выделения кода, упомянутых на этом сайте и в других местах, чтобы установить мою собственную иконку ICO. Нет радости Некоторые требуют использования Visual Studio, к которому я надеюсь не go вернуться. Простейший предлагаемый маршрут XAML, похоже, добавляет строку, подобную этой ...

Icon="MyFavicon.ico"

... ниже строки заголовка на испытательном стенде ниже. Но это выдает эту ошибку:

Exception calling "Load" with "1" argument(s): "Failed to create a 'Icon' from the text 'StribLogoFavicon.ico'."
At M:\Scripting\Saxophone\Test\trivial_xaml_and_ps_for_icon_troubleshooting_v18.ps1:26 char:2
+     $Window = [Windows.Markup.XamlReader]::Load($Reader)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : XamlParseException

You cannot call a method on a null-valued expression.
At M:\Scripting\Saxophone\Test\trivial_xaml_and_ps_for_icon_troubleshooting_v18.ps1:28 char:1
+ $Window.ShowDialog()
+ ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

FWIW, тот же файл ICO ранее работал в строке заголовка HTA-версии этого проекта. Я также попробовал второй файл ICO.

Расположение файла ICO не критично для моих целей развертывания. Я пытался создать сценарий для папки root и подпапки.

Вот скелет моего проекта. Кто-нибудь может предложить решение? Может быть, мы сможем использовать этот стенд для документирования легко подтверждаемого. Спасибо!

#Trivial pared-down app GUI for icon troubleshooting
    Add-Type -AssemblyName presentationframework, presentationcore, windowsbase
    #Begin XAML code for GUI
    [xml]$xaml = @"
    <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            x:Name="Demo_WPF_Window"
            Title="How to change icon at left?" Height="150" Width="320" WindowStyle="SingleBorderWindow" Background="#FFECBD5A" ResizeMode="NoResize"
    >
        <Grid x:Name="Grid">
            <Grid Margin="18,64,0,18">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="25*"/>
                <ColumnDefinition Width="126*"/>
                <ColumnDefinition Width="6*"/>
            </Grid.ColumnDefinitions>
        </Grid>
        <Label x:Name="Label_Icon_testbed" Content="Icon is ICO file in same folder as PS1 script" HorizontalAlignment="Left" Height="45" Margin="19,10,0,0" VerticalAlignment="Top" Width="240" FontSize="11" FontWeight="Bold" Grid.ColumnSpan="2"/>
    </Grid>
   </Window>
"@
#Prepare the GUI
    $Reader = New-Object System.Xml.XmlNodeReader $xaml
    $Window = [Windows.Markup.XamlReader]::Load($Reader)
#Render the GUI
    $Window.ShowDialog()

Ответы [ 2 ]

0 голосов
/ 12 января 2020

Вот рабочий ответ Шамуса - высоко ценится! - интегрирован с нижней частью кода тестового стенда выше:

$Reader = New-Object System.Xml.XmlNodeReader $xaml

$Window = [Windows.Markup.XamlReader]::Load($Reader)


$Window.add_Loaded({
    $Window.Icon = "C:\full\path\to\favicon.ico"
})

$Window.ShowDialog()
0 голосов
/ 10 января 2020

Мне удалось добавить значок, установив значок в событии Window Loaded:

#region Load the Assemblies
Add-Type -assemblyName PresentationFramework
Add-Type -assemblyName PresentationCore
Add-Type -assemblyName WindowsBase
#endregion

#region XAML
[xml]$XAML = @"
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Testing" Height="200" Width="300" >

</Window>
"@
#endregion XAML

#Load the XAML and catch a failure
$reader=(New-Object System.Xml.XmlNodeReader $xaml) 
try{$Window=[Windows.Markup.XamlReader]::Load( $reader )}
catch{Write-Host "Unable to load Windows.Markup.XamlReader. Some possible causes for this problem include: .NET Framework is missing PowerShell must be launched with PowerShell -sta, invalid XAML code was encountered."; exit}

##XAML Should have loaded NOW

#Set all "Names" as Variables
$xaml.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]") | ForEach-Object{
    Set-Variable -Name ($_.Name) -Value $Window.FindName($_.Name)
}

#region EVENTS
$Window.add_Loaded({
    $Window.Icon = "C:\Path\to\Icon.ico"
})
#endregion EVENTS


##Show the Window - Wrap ShowDialog in the Async Dispatcher to prevent powershell from crashing on second run
$async = $window.Dispatcher.InvokeAsync({
    $window.ShowDialog() | Out-Null
})
$async.Wait() | Out-Null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...