none
Не могу правильно составить код RRS feed

  • Вопрос

  • Namespace WpfApplication34
      
      Partial Public Class MainWindow
        Inherits Window
        Public Sub New()
          InitializeComponent()
          image1.source = ToImageSource(canvas1)
        End Sub
    
    
        Public Shared Function ToImageSource(ByVal obj As FrameworkElement) As ImageSource
          ' Save current canvas transform
          Dim transform As Transform = obj.LayoutTransform
          obj.LayoutTransform = Nothing
    
          ' fix margin offset as well
          Dim margin As Thickness = obj.Margin
          obj.Margin = New Thickness(0, 0, margin.Right - margin.Left, margin.Bottom - margin.Top)
    
          ' Get the size of canvas
          Dim size As New Size(obj.Width, obj.Height)
    
          ' force control to Update
          obj.Measure(size)
          obj.Arrange(New Rect(size))
    
          Dim bmp As New RenderTargetBitmap(CInt(obj.Width), CInt(obj.Height), 96, 96, PixelFormats.Pbgra32)
    
          bmp.Render(obj)
    
          ' return values as they were before
          obj.LayoutTransform = transform
          obj.Margin = margin
          Return bmp
        End Function
    
        Private Sub InitializeComponent()
          Throw New NotImplementedException
        End Sub
    
        
        
      End Class
    End Namespace
    

    в окне есть канвас и имидж, нужно в имидже показать что есть в канвасе как картинку, но не получается,  Ошибка 1 "image1" не объявлен. Может быть недоступен из-за своего уровня защиты.

    Ошибка 2 "canvas1" не объявлен. Может быть недоступен из-за своего уровня защиты.


     


    22 февраля 2011 г. 6:54

Ответы

  • Выполните, пожалуйста, следующие действия:

    1. Создайте новый WPF-проект с названием MyWpfApplication.
    2. Замените содержимое файла MainWindow.xaml следующим:
      <Window x:Class="MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="MainWindow" Height="476" Width="679">
       <Grid>
        <Canvas Height="410" HorizontalAlignment="Left" Margin="29,12,0,0" x:Name="Canvas1" VerticalAlignment="Top" Width="313">
         <Label Canvas.Left="106" Canvas.Top="120" Content="Label" Height="28" Name="Label1" />
        </Canvas>
        <Image Height="150" HorizontalAlignment="Left" Margin="383,105,0,0" x:Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="200" />
       </Grid>
      </Window>
      
      
    3. Замените содержиме файла MainWindow.xaml.vb следующим:
      Partial Public Class MainWindow
        Inherits Window
        Public Sub New()
          InitializeComponent()
          image1.source = ToImageSource(canvas1)
        End Sub
      
        Public Shared Function ToImageSource(ByVal obj As FrameworkElement) As ImageSource
          ' Save current canvas transform
          Dim transform As Transform = obj.LayoutTransform
          obj.LayoutTransform = Nothing
      
          ' fix margin offset as well
          Dim margin As Thickness = obj.Margin
          obj.Margin = New Thickness(0, 0, margin.Right - margin.Left, margin.Bottom - margin.Top)
      
          ' Get the size of canvas
          Dim size As New Size(obj.Width, obj.Height)
      
          ' force control to Update
          obj.Measure(size)
          obj.Arrange(New Rect(size))
      
          Dim bmp As New RenderTargetBitmap(CInt(obj.Width), CInt(obj.Height), 96, 96, PixelFormats.Pbgra32)
      
          bmp.Render(obj)
      
          ' return values as they were before
          obj.LayoutTransform = transform
          obj.Margin = margin
          Return bmp
        End Function
      End Class
      
      
    4. Попробуйте скомпилировать проект.
    5. Сообщите о результатах в этой теме.
    • Помечено в качестве ответа PavelMD 22 февраля 2011 г. 8:22
    22 февраля 2011 г. 8:05
  • Для этого нужно изменить код примерно таким образом:

    MainWindow.xaml:

    <Window x:Class="MainWindow"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     Title="MainWindow" Height="476" Width="679">
      <Grid>
        <Canvas Height="410" HorizontalAlignment="Left" Margin="29,12,0,0" x:Name="Canvas1" VerticalAlignment="Top" Width="313">
          <Label Canvas.Left="106" Canvas.Top="120" Content="Label" Height="28" Name="Label1" />
        </Canvas>
        <Image Height="150" HorizontalAlignment="Left" Margin="383,105,0,0" x:Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="200" />
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="383,280,0,0" Name="Button1" VerticalAlignment="Top" Width="75" />
      </Grid>
    </Window>
    
    

    MainWindow.xaml.vb:

    Partial Public Class MainWindow
      Inherits Window
      Public Sub New()
        InitializeComponent()
      End Sub
    
      Public Shared Function ToImageSource(ByVal obj As FrameworkElement) As ImageSource
        ' Save current canvas transform
        Dim transform As Transform = obj.LayoutTransform
        obj.LayoutTransform = Nothing
    
        ' fix margin offset as well
        Dim margin As Thickness = obj.Margin
        obj.Margin = New Thickness(0, 0, margin.Right - margin.Left, margin.Bottom - margin.Top)
    
        ' Get the size of canvas
        Dim size As New Size(obj.Width, obj.Height)
    
        ' force control to Update
        obj.Measure(size)
        obj.Arrange(New Rect(size))
    
        Dim bmp As New RenderTargetBitmap(CInt(obj.Width), CInt(obj.Height), 96, 96, PixelFormats.Pbgra32)
    
        bmp.Render(obj)
    
        ' return values as they were before
        obj.LayoutTransform = transform
        obj.Margin = margin
        Return bmp
      End Function
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
        image1.Source = ToImageSource(Canvas1)
      End Sub
    End Class
    

    • Помечено в качестве ответа PavelMD 22 февраля 2011 г. 8:22
    22 февраля 2011 г. 8:20

Все ответы

  • Как я понимаю, у Вас используется WPF-проект.

    В XAML-разметке у Вас должны быть два элемента — Image и Canvas. Добавьте для них атрибуты x:Name="image1" для Image и x:Name="canvas1" для Canvas.

    Пример:

    <Canvas x:Name="canvas1" />
    

    22 февраля 2011 г. 7:32
  • вот xaml код
    <Window x:Class="MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="MainWindow" Height="476" Width="679">
      <Grid>
        <Canvas Height="410" HorizontalAlignment="Left" Margin="29,12,0,0" x:Name="Canvas1" VerticalAlignment="Top" Width="313">
          <Label Canvas.Left="106" Canvas.Top="120" Content="Label" Height="28" Name="Label1" />
        </Canvas>
        <Image Height="150" HorizontalAlignment="Left" Margin="383,105,0,0" x:Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="200" />
      </Grid>
    </Window>
    
    
    не ошибка осталась.
    22 февраля 2011 г. 7:40
  • не ошибка осталась.

    Но теперь ведь ошибка другая, да? Или та же самая?

    Если теперь ошибка про дублирующийся InitializeComponent(), удалите этот метод из кода.

    22 февраля 2011 г. 7:50
  • не ошибка осталась.

    Но теперь ведь ошибка другая, да? Или та же самая?

     

    oшибка та же самая,
    22 февраля 2011 г. 7:55
  • Выполните, пожалуйста, следующие действия:

    1. Создайте новый WPF-проект с названием MyWpfApplication.
    2. Замените содержимое файла MainWindow.xaml следующим:
      <Window x:Class="MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="MainWindow" Height="476" Width="679">
       <Grid>
        <Canvas Height="410" HorizontalAlignment="Left" Margin="29,12,0,0" x:Name="Canvas1" VerticalAlignment="Top" Width="313">
         <Label Canvas.Left="106" Canvas.Top="120" Content="Label" Height="28" Name="Label1" />
        </Canvas>
        <Image Height="150" HorizontalAlignment="Left" Margin="383,105,0,0" x:Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="200" />
       </Grid>
      </Window>
      
      
    3. Замените содержиме файла MainWindow.xaml.vb следующим:
      Partial Public Class MainWindow
        Inherits Window
        Public Sub New()
          InitializeComponent()
          image1.source = ToImageSource(canvas1)
        End Sub
      
        Public Shared Function ToImageSource(ByVal obj As FrameworkElement) As ImageSource
          ' Save current canvas transform
          Dim transform As Transform = obj.LayoutTransform
          obj.LayoutTransform = Nothing
      
          ' fix margin offset as well
          Dim margin As Thickness = obj.Margin
          obj.Margin = New Thickness(0, 0, margin.Right - margin.Left, margin.Bottom - margin.Top)
      
          ' Get the size of canvas
          Dim size As New Size(obj.Width, obj.Height)
      
          ' force control to Update
          obj.Measure(size)
          obj.Arrange(New Rect(size))
      
          Dim bmp As New RenderTargetBitmap(CInt(obj.Width), CInt(obj.Height), 96, 96, PixelFormats.Pbgra32)
      
          bmp.Render(obj)
      
          ' return values as they were before
          obj.LayoutTransform = transform
          obj.Margin = margin
          Return bmp
        End Function
      End Class
      
      
    4. Попробуйте скомпилировать проект.
    5. Сообщите о результатах в этой теме.
    • Помечено в качестве ответа PavelMD 22 февраля 2011 г. 8:22
    22 февраля 2011 г. 8:05
  • спасибо получилось! и последний вопрос, все это происходит когда окно открывается, а как можно передать "изображение" из канваса в имидж при нажатии на кнопку?
    22 февраля 2011 г. 8:13
  • Для этого нужно изменить код примерно таким образом:

    MainWindow.xaml:

    <Window x:Class="MainWindow"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     Title="MainWindow" Height="476" Width="679">
      <Grid>
        <Canvas Height="410" HorizontalAlignment="Left" Margin="29,12,0,0" x:Name="Canvas1" VerticalAlignment="Top" Width="313">
          <Label Canvas.Left="106" Canvas.Top="120" Content="Label" Height="28" Name="Label1" />
        </Canvas>
        <Image Height="150" HorizontalAlignment="Left" Margin="383,105,0,0" x:Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="200" />
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="383,280,0,0" Name="Button1" VerticalAlignment="Top" Width="75" />
      </Grid>
    </Window>
    
    

    MainWindow.xaml.vb:

    Partial Public Class MainWindow
      Inherits Window
      Public Sub New()
        InitializeComponent()
      End Sub
    
      Public Shared Function ToImageSource(ByVal obj As FrameworkElement) As ImageSource
        ' Save current canvas transform
        Dim transform As Transform = obj.LayoutTransform
        obj.LayoutTransform = Nothing
    
        ' fix margin offset as well
        Dim margin As Thickness = obj.Margin
        obj.Margin = New Thickness(0, 0, margin.Right - margin.Left, margin.Bottom - margin.Top)
    
        ' Get the size of canvas
        Dim size As New Size(obj.Width, obj.Height)
    
        ' force control to Update
        obj.Measure(size)
        obj.Arrange(New Rect(size))
    
        Dim bmp As New RenderTargetBitmap(CInt(obj.Width), CInt(obj.Height), 96, 96, PixelFormats.Pbgra32)
    
        bmp.Render(obj)
    
        ' return values as they were before
        obj.LayoutTransform = transform
        obj.Margin = margin
        Return bmp
      End Function
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
        image1.Source = ToImageSource(Canvas1)
      End Sub
    End Class
    

    • Помечено в качестве ответа PavelMD 22 февраля 2011 г. 8:22
    22 февраля 2011 г. 8:20