블로그 이미지
평강왕자

카테고리

분류 전체보기 (35)
Programming Lv1 (32)
Programming LV2 (0)
취미 (3)
Total
Today
Yesterday

달력

« » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

공지사항

최근에 올라온 글

WPF를 사용하다보면 UserControl에서 Windows에 함수를 호출해야 하는 경우가 있다.

코드상으로 객체를 생성하면 별 문제가 없다. 생성할때 아래와 같이 자신의 객체를 넘겨 주면 알 수 있다.

private MainWindow ;

public DataManager()
{
    this.InitializeComponent();
}

public DataManager(MainWindow parent)
{
    this.InitializeComponent();
    this.parent = parent;
}

위에와 같이 DataManager UserControl에 생성자를 하나 더 추가하고 MainWindow Window에서 생성할때

DataManager datamanager = new DataManager(this);

코드상으로 객체를 생성하지 않고 Xaml 코드를 사용하면 생성자에 객체를 넣어서 넘겨 줄 수가 없다.

이런 경우 난감해진다.

하지만 event를 사용하면 해당 이벤트를 호출하여 다른     객체에서 event를 감지하여 처리가 가능하다.

Xaml코드에서 해당 객체에 Name을 주고 코드에서 그 객체에 Event핸들러를 추가해 주면 된다.

1. UserControl에 event 변수를 추가 한다.

public event EventHandler EventDataManager;

2. Windows에서 객체에 Event처리 함수를 등록한다.

dataManager.EventDataManager += new EventHandler(dataManager_EventDataManager);

void dataManager_EventDataManager(object sender, EventArgs e)
{
    //처리할 내용
}

3. UserControl에서 호출할 시점에 아래와 같이 Event를 발생 시킨다.

EventDataManager(this, null);

이렇게 사용하면 UserControl에서 버튼 클릭시 이벤트를 발생시키면 실제 처리는 등록해 놓은 함수가 Windows에 있기 때문에

 Windows가 호출 된다. 그러면 Windows에서 객체를 사용하고 처리 하면 된다.

Posted by 평강왕자
, |

다른 스레드가 이 개체를 소유하고 있어 호출한 스레드가 해당 개체에 액세스할 수 없습니다.

Exception이 발생하면서 프로그램이 죽어버렸다.

C# WPF을 시작한지 얼마되지 않아서 검색 해 보니 WPF는 메인스레드가 UI 객체를 가지고 있어서 다른 스레드에서 접근하여

사용하려 하면 Exception을 발생시킨다고 하더군요;;

해결 방법은 Dispatcher.Invoke(DispatcherPriority, Delegate) 함수를 사용하면 해결 됩니다.

http://msdn.microsoft.com/ko-kr/library/ms591593.aspx <-- msdn링크

설명은 잘 나와있습니다. 만능 MSDN;;

실제로 적용하면 아래와 같은 코드를 다른 스레드에 집어넣어서 사용하면 Exception이 발생합니다.

controlSendBtn.Visibility = Visibility.Collapsed;

이것을 아래와 같이 바꿔줍니다.

Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate
{
    controlSendBtn.Visibility = Visibility.Collapsed;
 }));

그러면 메인스레드와 동기화 시켜서 Exception없이 잘 돌아갑니다.

 

Posted by 평강왕자
, |

telerik RadGridView를 사용하면 기본적으로 항목을 더블클릭하여 수정할 수 있다.

그 항목을 수정할시에 수정되었을때 이벤트를 주고 싶을 때 RowEditEnded Properties를 사용하면 이벤트를 줄 수 있다.

소스는 아래와 같다.

Xaml

<telerik:RadGridView x:Name="UserGridView" Margin="20,40,20,0" VerticalAlignment="Top" Height="278" ItemsSource="{Binding UserList}" RowIndicatorVisibility="Hidden" CanUserDeleteRows="False" CanUserInsertRows="False" RowEditEnded="UserGridView_RowEditEnded" ShowGroupPanel="False" AutoGenerateColumns="False">

cs

private void UserGridView_RowEditEnded(object sender, Telerik.Windows.Controls.GridViewRowEditEndedEventArgs e)
{
      데이터형식 변수 = (데이터형식)UserGridView.SelectedItem;
}

위 코드는 에디트시에 선택한 항목을 가져오는 소스이다.

사용하고자 하는 형태에 맞게 변경 하면 된다.

기본적으로 수정이 가능하지만 수정하면 안돼는 경우에는 Column의 ReadOnly Properties를 사용하면 된다.

<telerik:GridViewDataColumn UniqueName="ID" Header="사용자 ID" HeaderTextAlignment="Center" IsReadOnly="True" IsFilterable="False" MaxWidth="240" Width="120"/>

true일 경우 수정이 불가능하고 false인 경우 수정이 가능하다 기본값은 false이다.

 

Posted by 평강왕자
, |

최근에 달린 댓글

글 보관함