2013-04-07 9 views
2

У меня есть идея, как сделать только один из этих req, а не их обоих.Загрузка большого изображения в приложение WPF - требуется прокрутка и рисование

Для загрузки большого изображения и возможности прокрутки, чтобы увидеть все его части, я добавил изображение внутри <ScrollViewer/> и получил то, что мне нужно.

Для получения изображения, я смог загрузить это изображение в качестве фона <Canvas/>.

Но как выполнить оба?

В принципе, у меня очень большое изображение, которое я не хочу сжимать, и на этом изображении есть куча комнат, нарисованных на нем (например, план этажа здания). У меня есть координаты комнат, и когда пользователь щелкает внутри комнаты, я хочу заполнить эту комнату цветом (в настоящее время у меня только есть список, в котором говорится, что «Комната 1 была нажата»).

Editted XAML (для сжатия изображения):

<Grid Margin="10"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="30" /> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="200" /> 
    </Grid.RowDefinitions> 

    <ComboBox x:Name="buildingCombo" Grid.Row="0" ItemContainerStyle="{DynamicResource ComboItemStyle}" Tag="{Binding}" 
       Template="{StaticResource ComboBoxTemplate}" Width="1000" SelectionChanged="buildingCombo_SelectionChanged"/> 

    <Grid Grid.Row="1"> 

     <ScrollViewer Grid.Column="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
      <Canvas Width="{Binding ActualWidth, ElementName=image}" Height="{Binding ActualHeight, ElementName=floorPlanImage}" > 
       <Canvas.Background> 
        <VisualBrush > 
         <VisualBrush.Visual> 
          <Image Grid.Column="0" Stretch="None" x:Name="floorPlanImage" MouseLeftButtonDown="Image_MouseLeftButtonDown"/> 
         </VisualBrush.Visual> 
        </VisualBrush> 
       </Canvas.Background> 
      </Canvas> 
     </ScrollViewer> 
    </Grid> 

    <DataGrid Grid.Row="2" ColumnHeaderStyle="{DynamicResource GridViewColumnHeaderStyle}" Background="LightGray" RowBackground="LightYellow" AlternatingRowBackground="LightBlue" 
       x:Name="dataGridViewRoomQuery" BorderBrush="Gray" BorderThickness="5"/> 

</Grid> 
+0

Вам нужен рисунок от руки? –

+0

Нет, просто заполните прямоугольник сплошным цветом программно – user1524713

+0

Тогда для чего вам нужен 'InkCanvas'? Я не понимаю. –

ответ

4

Вы можете просто установить Canvas размер до размера Image, что вы установили в качестве Background, Это позволит использовать ScrollViewer и сохранить правильный размер, когда Image установлен как CanvasBackground

Пример:

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
    <Canvas Width="{Binding ActualWidth, ElementName=image}" Height="{Binding ActualHeight, ElementName=image}" > 
     <Canvas.Background> 
      <VisualBrush > 
       <VisualBrush.Visual> 
        <Image x:Name="image" Source="/WpfApplication10;component/Capture.PNG" /> 
       </VisualBrush.Visual> 
      </VisualBrush> 
     </Canvas.Background> 
    </Canvas> 
</ScrollViewer> 

Результат:

enter image description here

+0

Спасибо, что очень близко к тому, что мне нужно. Как избежать уменьшения размера изображения при изменении размера окна? Изображение является частью сетки с DataGrid внизу. Я думал, что Stretch = «None», но это не работает. – user1524713

+0

Изображение не будет полностью заштриховано, я думаю, что ваша сетка настроена неправильно, можете ли вы показать свой Xaml для Grid/DataGrid –

+0

Добавлен как редактирование на мой вопрос .. спасибо – user1524713

 Смежные вопросы

  • Нет связанных вопросов^_^