2009-07-28 4 views
0

나는 이미지를 표시하기 위해 간단한 usercontrol을 만들고, 결국 WPF 응용 프로그램에서 버튼 역할을하도록 노력해 왔습니다.이 이미지를 WPF 사용자 컨트롤에 표시하려면 무엇이 필요합니까?

이러한 사용자 정의 컨트롤 중 하나가 폼의 XAML에 쓰여지고 이미지가 항상 표시됩니다. 그러나 프로그래밍 방식으로 스택 패널에 추가 할 때는 컨트롤이 있지만 이미지는 표시되지 않습니다. (간단하지만이 예를 들어 작동) 내가 ImageSource 형식의 종속성 속성으로 Source 속성을 설정

<UserControl x:Class="ImgButton" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    MinHeight="32" MinWidth="32" 
    x:Name="uc_ImgButton"> 
    <Border BorderBrush="Gray" BorderThickness="2"> 
     <Image Source="{Binding ElementName=uc_ImgButton, Path=Source}" x:Name="img"/> 
    </Border> 
</UserControl> 

: 여기

은 UserControl을의 여기

Partial Public Class ImgButton 

    Public Property Source() As ImageSource 
     Get 
      Return GetValue(SourceProperty) 
     End Get 
     Set(ByVal value As ImageSource) 
      SetValue(SourceProperty, value) 
     End Set 
    End Property 

    Public Shared ReadOnly SourceProperty As DependencyProperty = _ 
          DependencyProperty.Register("Source", _ 
          GetType(ImageSource), GetType(ImgButton)) 

End Class 

의 예 VB에서 프로그래밍 방식으로 이들을 추가하는 방법 :

Dim newBtn As New myApp.ImgButton 
newBtn.Width = 100 
newBtn.Height = 100 
Dim bi As New BitmapImage 
bi.BeginInit() 
bi.UriSource = New Uri("C:\test.png", UriKind.RelativeOrAbsolute) 
bi.EndInit() 
'MsgBox(bi.Width) '(a simple debug test I added) 
newBtn.Source = bi 
Me.StackPanelMain.Children.Add(newBtn) 

이상한 부분은 ... 코드 a 위의 이미지는 오류없이 실행되지만 내 양식의 결과는 내부에 이미지가없는 빈 테두리입니다.

그러나 MsgBox 행의 주석을 해제하면 이미지가 표시됩니다. BitmapImage에서 값을 얻도록 강요하는 것처럼 동작합니다. 나는 또한 MsgBox 라인을 "dim x as integer = bi.PixelWidth"와 같은 무언가로 대체하려고 시도했으며 이미지 디스플레이를 만들었습니다. 내가 가져 가면 내 양식에 이미지가 없어집니다.

나는 뭔가를 놓치고 있거나 뭔가를 이해하지 못한다고 생각합니다. 내 앱에서 겉으로보기에 무의미한 코드 줄을 남겨두기보다는 무슨 일이 일어나고 있는지 배우고 싶습니다.

답변

0

멀리 알다시피, 당신은 이것을 위해 사용자 정의 컨트롤이 필요 없습니다. 스타일이 지정된 단추조차도 아닙니다. 버튼의 채우기 속성을 Image Brush로 설정하면됩니다. 이미지 버튼 :)

0

설정하려는 바인딩을 이해할 수 있는지 확실하지 않습니다. 일반적으로 ElementName을 사용하면 동일한 시각적 트리에서 다른 컨트롤에 바인딩한다는 의미입니다. 그러나 ImgButton 클래스의 코드 샘플을 보면 정상적인 클래스 인 것처럼 보입니다. ElementName을 사용 하시겠습니까?

또한 클래스가 DependencyProperty이되도록하려면 DependencyObject에서 파생되어야한다고 생각합니다. 변경하지 않으려면 항상 INotifyPropertyChanged을 구현하고 속성의 설정자에 PropertyChanged 이벤트를 발생시킵니다.

업데이트 : 나는 문제의 일부는 내가 질문을 (내가 ImgButtonUserControl 클래스라고 인식하지 않았다) 잘못 해석이었다 생각합니다.

어쨌든, 나는 여기서 무슨 일이 일어나고 있는지 잘 모르겠습니다. 그러나 속성이 이미지 자체가 아니라 이미지 파일의 경로를위한 것이라면 어떻게해야할까요?이 같은 아마 뭔가 :

XAML :

<UserControl x:Class="ImgButton" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    MinHeight="32" MinWidth="32" 
    x:Name="uc_ImgButton"> 
    <Border BorderBrush="Gray" BorderThickness="2"> 
     <Image> 
      <Image.Source> 
       <BitmapImage UriSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}, Path=Source}" /> 
      </Image.Source> 
     </Image> 
    </Border> 
</UserControl> 

C 번호 :

Partial Public Class ImgButton 

    Public Property Source() As String 
     Get 
      Return GetValue(SourceProperty) 
     End Get 
     Set(ByVal value As ImageSource) 
      SetValue(SourceProperty, value) 
     End Set 
    End Property 

    Public Shared ReadOnly SourceProperty As DependencyProperty = _ 
          DependencyProperty.Register("Source", _ 
          GetType(String), GetType(ImgButton)) 

End Class 

그럼 그냥 이미지에 경로로 Source 속성을 설정 :

Dim newBtn As New myApp.ImgButton 
newBtn.Width = 100 
newBtn.Height = 100 
newBtn.Source = "C:\test.png" 
Me.StackPanelMain.Children.Add(newBtn) 

나는 천국 ' 전에 BitmapImage 클래스를 사용했지만 순서에 따라 걸릴 수도 있습니다. 이미지를 렌더링하게합니다. 나는 정말로 코드가 작동하지 않는 이유는 아니지만 XAML에서 바인딩을 통해 소스를 설정하면 원래 케이스와 더 비슷하게 작동 할 것입니다.

+0

내 WPF 경험의이 시점에서, 대부분의 작업은 내가 온라인으로 찾은 코드 스 니펫을 기반으로합니다. 난 그 안에 표시되는 이미지를 변경할 수있는 속성을 가진 usercontrol을 원한다. 이 작업을 수행하는 더 좋은 방법이 있다면, 무료로 요금을 지불하십시오. 배우고 싶습니다 :-) 나는 당신의 제안을 이해하지 못합니다 ... 샘플 코드가 도움이 될 것입니다. –

+0

추가 코드를 보내 주셔서 감사합니다. XAML에서 데이터 바인딩 문을 작성하는 방법과 특정 바인딩 방법을 사용하는 것이 적절한 지에 대해서는 항상 이해하지 못했습니다. –

+0

잠깐 기다리려면 시간이 걸립니다. VS2010에는 마크 업 확장 (바인딩 포함)에 대한 인텔리 센스가 있으므로 학습 곡선에 도움이 될 것으로 기대됩니다. – Andy

관련 문제