Скомпилируйте WPF Xaml, используя PowerShell типа Add без использования PowerBoots - PullRequest
2 голосов
/ 03 мая 2011

Я пытался добавить WPF-код, встроенный в XAML, и скомпилировать с использованием add-type powershell. Есть PowerBoots, но я не хочу этим пользоваться. Код, который я пытаюсь встроить: здесь . Я упомянул способ PowershellGuy реализации, но все же мне нужно использовать код файла.

Add-Type -AssemblyName presentationframework
[xml]$xaml = @' 
<Window 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1"  Height="350" Width="525" AllowsTransparency="True"  
WindowStyle="None" 
WindowState="Maximized" Topmost="False"  IsHitTestVisible="False">
</Window> 
'@ 

$reader=(New-Object Xml.XmlNodeReader $xaml) 
$Form=[Windows.Markup.XamlReader]::Load( $reader ) 
$Form.ShowDialog() | out-null

Код ссылки по ссылке:

protected override void OnRender(DrawingContext drawingContext)
{ 
   base.OnRender(drawingContext); 
   var screenGeometry = new RectangleGeometry(new Rect(0, 0, ActualWidth,   ActualHeight)); 
   var excludeRectangle = new RectangleGeometry(new Rect(200, 200, 150, 150)); 
   drawingContext.PushClip(CombinedGeometry.Combine(screenGeometry, excludeRectangle, GeometryCombineMode.Exclude, null)); 
   drawingContext.PushOpacity(.8);
   drawingContext.DrawRectangle(Brushes.Black, null, new Rect(0, 0, ActualWidth, ActualHeight));
   drawingContext.Pop(); drawingContext.Pop(); 
    } 

Спасибо!

Ответы [ 2 ]

1 голос
/ 03 мая 2011

Не знаю, помогает ли это, но вот пример, где какой-то код PowerShell добавляется после действия нажатия кнопки.

#requires -version 2
Add-Type -AssemblyName PresentationFramework
[xml]$xaml = 
@"
<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="Window1" Height="300" Width="408">
    <Grid>
      <Button x:Name="button1"
                Width="75"
                Height="23"
                Canvas.Left="118"
                Canvas.Top="10"
                Content="Click Here" />
    </Grid>
</Window>
"@

Clear-Host
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$target=[Windows.Markup.XamlReader]::Load($reader)
$control=$target.FindName("button1")
$eventMethod=$control.add_click
$eventMethod.Invoke({$target.Title="Hello $((Get-Date).ToString('G'))"})
$target.ShowDialog() | out-null 
1 голос
/ 03 мая 2011

У вас не может быть выделенного кода в XAML, который загружается через XamlReader, что в основном означает, что вы не можете делать то, что пытаетесь (переопределить метод OnRender в Window в свободном XAML), не создаваяновый тип, производный от класса Window ...

Но это то, что вы пытаетесь сделать излишним, я думаю:

Add-Type -AssemblyName presentationframework
[xml]$xaml = @' 
<Window 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
AllowsTransparency="True" WindowStyle="None" 
Background="#AA000000" WindowState="Maximized" 
Height="{x:Static SystemParameters.PrimaryScreenHeight}"
Width="{x:Static SystemParameters.PrimaryScreenWidth}" 
Title="Window Title" Topmost="False"  IsHitTestVisible="False"></Window> 
'@ 

$reader=(New-Object Xml.XmlNodeReader $xaml) 
$Form=[Windows.Markup.XamlReader]::Load( $reader ) 
$Form.ShowDialog() | out-null
...