2011-01-27 3 views
0

Я новичок в WPF, так что медведь со мной. Я установил фоновое изображение своего окна с помощью ImageBrush, и теперь я хочу, чтобы размер моего окна был точно размером с фоновым изображением. Очевидным решением для этого является просто задание свойства width/height вручную с помощью измерений пикселей моего фонового изображения, но это кажется слишком наивным. Каков наилучший способ сделать это? Вот мой XAML до сих пор:Размер окна такой же, как размер фонового изображения в WPF

<Window x:Class="FruitFactory.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Fruit Factory" Height="576" WindowStyle="None" DataContext="{Binding}" ResizeMode="NoResize" Width="834"> 
    <Window.Background> 
     <ImageBrush ImageSource="/FruitFactory;component/Graphics/FruitFactoryBackground.png"></ImageBrush> 
    </Window.Background> 
    <Window.Resources> 
    </Window.Resources> 
    <Grid> 
     <ComboBox Height="23" HorizontalAlignment="Left" Margin="52,27,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" /> 
    </Grid> 
</Window> 

Я использую Visual Studio 2010 и .NET 4.0

ответ

5

Вы можете связать ширину и высоту PixelWidth и PixelHeight в ImageSource для ImageBrush как это

Обновление

Реализованное мое предыдущее решение не сработало, потому что у ImageSource не было PixelWidth/PixelHeight, так как это не было BitmapImage. Я должен был использовать BitmapImage ресурс, но вместо этого то привязки не будет работать, если я не объявить ресурс перед креплениями (ошибка кого-нибудь?)

<Window x:Class="WindowSameSizeAsBackground.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Fruit Factory" 
     WindowStyle="None" 
     DataContext="{Binding}" 
     ResizeMode="NoResize"> 
    <Window.Resources> 
     <BitmapImage x:Key="backgroundBrush" 
        UriSource="/FruitFactory;component/Graphics/FruitFactoryBackground.png"/> 
    </Window.Resources> 
    <Window.Width> 
     <Binding Source="{StaticResource backgroundBrush}" Path="PixelWidth"/> 
    </Window.Width> 
    <Window.Height> 
     <Binding Source="{StaticResource backgroundBrush}" Path="PixelHeight"/> 
    </Window.Height> 
    <Window.Background> 
     <ImageBrush x:Name="imageBrush" 
        ImageSource="{StaticResource backgroundBrush}"></ImageBrush> 
    </Window.Background> 
    <Grid> 
     <ComboBox Height="23" HorizontalAlignment="Left" Margin="52,27,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" /> 
     <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="258,179,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
    </Grid> 
</Window> 
+0

Это кажется почти работает. Являются ли атрибуты Ширина/Высота для окна измерены в пикселях? Размер близок, но не идеален, и я все еще вижу некоторое растяжение фонового изображения. Я понимаю, что WPF является независимым от разрешения, но я надеялся найти способ получить фоновое изображение, точно измеренное в пикселях. –

+0

@Bob: Обновленный мой ответ, это решение будет работать лучше. К сожалению, он стал немного менее прямым. BitmapImage можно поместить в App.xaml в качестве более чистого решения. Окно –

+0

не изменяет размер, это вздор в WPF. –

1

ImageBrush не лучшим решением для таких требований, поскольку он не имеет свойств Width/Height и не присутствует в VisualTree (это просто инструмент для рендеринга).

Слои помогут вам:

<Window> 
    <Grid > 
     <Image Stretch="Fill" 
       Source="***some uri***"/> 
     <StackPanel> 
      <Button Height="40" 
        Margin="20" 
        Content="Ololo"/> 
     </StackPanel> 
    </Grid> 
<Window> 
Смежные вопросы