비주얼 스튜디오 등에서 xaml파일을 볼때 보여지는 컨트롤은
그냥 보여지는게 아니라 Init 된 후 보여지는겁니다. (아마도? )
근데 만약 어떤 컨트롤이 초기화 될때
뭐 웹페이지의 어떤 스크립트를 호출한다든지 하는 코드가 있을때
그놈을 디자인모드에서 보면 에러가 나겠죠

그러면 Init할때
이놈이 디자인모드에서 보여지는지를 보고
아닐때만 적절한 초기화를 하면 됩니다.
그때 사용할 수 있는게

DesignerProperties.GetIsInDesignMode(DependencyObject element)

이놈입니다.
흐흐..
by 피요히코~ 2010. 12. 8. 15:06
실버라이트에서 datagrid를 사용할때
안에 기본 textbox나 textblock이 아니라 checkbox나 combobox등을 넣어서 사용해야 할 때도 있져.
근데 checkbox를 사용해서 checked이벤트를 이용해 뭔가 해야 할 때가 있습니다.

근데 이놈이
실제로 체크를 하지 않은넘들까지 지 혼자 체크가 되는 경우가 생깁니다.
(찾아보니 checkbox만의 문제는 아니라 datagrid의 스크롤과 관련된 문제로 보이네요)

위에 세놈을 체크하고 스크롤로 내려보면 아래에 엄한 애들까지 체크가 되어있고.
근데 이게 UI상에서는 체크가 되어 있지만 실제로 체크 이벤트를 타지는 않기 때문에
체크때 뭔가 작업을 해준게 있다면 거기엔 적용이 안됩니다. 허허...

해결방법은..
그냥 scrollviewer로 datagrid를 감싸주면 됩니다.-_-ㅋ
이게 정말 단순히 datagrid에서 스크롤이 일어날때 발생하는 문제인가 보네요

datagrid의 VerticalScrollBarVisibility를 hidden을 주고
감싸고 있는 scrollviewer에 VerticalScrollBarVisibility를 auto를 주고 테스트 해보니
잘 되네요..

실버라이트가 참.
이래저래 요상한 부분이 많네요. -_-
System.Data도 쓸수 있게 해줬으면. ㅠㅠ
by 피요히코~ 2010. 12. 1. 11:21

다른게 있을지 모르지만. 찾은게 이거라서.. (--)

실버라이트에서 특정 시간에(특정 시간이 흘렀을때) 뭔가 해줘야 할때 쓰면 좋습니다. 흐흐

몰라서 그렇지 알고 나면 아주 간단합니다.

DispatcherTimer 형식의 인스턴스를 만들어 주고
시간간격을 Interval 로 정해주고
Tick 이벤트 만들어줘서 실제로 수행할 일을 정해주고
Start(혹은 Stop) 해주면 끝입니다.


예를 들어보자면

DispatcherTimer timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(3) };

이런놈을 멤버변수 정도로 만들어주고(시간간격은 3초가 됩니다)

특정부분에서(로드시라든지 뭐..)

timer.Tick += new EventHandler(timer_Tick);

이렇게 이벤트 만들어주고

void timer_Tick(object sender, EventArgs e)
{
//안에 수행할 일들 넣어주고
}

이 타이머(?) 를 시작시킬 위치에서

timer.Start() ;

해주면 끗!!!

간단하네요~
by 피요히코~ 2010. 9. 28. 20:34

간만에 하고 있는 실버라이트....
자주 써야 할꺼 같은걸 하나 정리합니다~

뭐 다른데서도 마찬가지지만
실버라이트에서도 프로그램 실행시 사용되는 이미지등을 리소스로 따로 모아두고 사용합니다.
이 리소스는 빌드액션(Build Action)방식에 따라 패키지되는 방식을 정할수 있는데

빌드액션은 다름 세가지로 분류됩니다.

1. None(없음) - 없으니까 리소스를 포함하지 않는거죠
2. Content(내용) - 리소스를 프로젝트 패키지파일(*.xap)파일에 포함합니다.
3. Resource(리소스) - 리소스를 프로젝트의 어셈블리파일(*.dll)에 포합합니다.


간단해 보이는 내용인데 왜 이걸 정리하느냐??
빌드액션에 따라서 리소스 참조 URI가 달라지기 때문이죠...(아.. 헷깔린다... ㅠ-ㅠ)

URI는 경로를 나타내므로 (당연히)상대경로와 절대경로가 있습니다.
그리고 참조해야 하는 리소스는
해당 프로그램의 패키지파일을 기준으로 패키지보다 상위에 있을수도 있고
패키지와 같은레벨에 있을수도
패키지 하위에 있을수도
패키지 하위의 어셈블리에 있을수도 있죠

1. 패키지보다 상위레벨에 존재하는 리소스의 경우에는 상대경로는 사용할 수 없습니다.  닥치고 절대경로...
   (ex : http://bravochoi.tistory.com/images/sample.jpg ) ( 없는 경로니 눌르는일 없도록... ㄷㄷㄷ)
2. 패키지와 같거나 하위레벨에 존재하는 리소스의 경우에는 상대/절대 경로 모두 사용 가능합니다. 
   (ex : http://bravochoi.tistory.com/resources/images/sample.jpg  절대경로)
   (ex : /resources/images/sample.jpg  상대경로)
   (ex : resources/images/sample.jpg   상대경로2)
3. 어셈블리에 들어있는 경우에는 /어셈블리명;component/경로 와 같은 형식으로 사용가능합니다.
   (ex : 패키지에 있는 resources.dll이라는 어셈블리에 sample.jpg가 있는 경우
           /resources;compenet/sample.jpg  요렇게)
4. 빌드애션을 Content로 해서 리소스가 패키지에 포함된 경우에는 상대경로로 접근해야 하며 시작은 / 로 해야됩니다
   (ex : /sample.jpg)
5. 빌드액션을 Resource로 해서 리소스가 프로젝트의 어셈블리에 포함되어 있을때는 상대경로로 접근해야 하며 / 를 붙이면 안됩니다.
   (ex : sample.jpg)
   (ex : images/sample.jpg)

3번과 5번의 차이는
5번은 프로젝트에 추가한 리스소용 파일을 빌드액션을  resource로 했을때 접근하는 방법이고
3번은 다른 어셈블리(참조추가된)에 있는 리소스에 접근할때 입니다.




 

by 피요히코~ 2010. 8. 25. 02:38
텍스트 컨트롤중 하나
읽기전용

Inlines를 이용하여 여러 서식 적용 가능

XAML


        
            
                
                    Hello
                
                
                    World
                
                
                
                    Test
                
            
        
    

CS
           TextBlock tb_Test = new TextBlock();//TextBlock 만들고
            Run rn = new Run();//Run 만들고
            rn.Foreground = new SolidColorBrush(Colors.Yellow); //Foreground 설정
            rn.FontFamily = new FontFamily("Arial");//Font 설정
            rn.FontSize = 20;//Size 설정
            rn.Text = "Hello";//Text 설정

            tb_Test.Inlines.Add(rn); //추가

            Run rn2 = new Run();
            rn2.Foreground = new SolidColorBrush(Colors.Blue);
            rn2.FontSize = 10;
            rn2.Text = "World";

            tb_Test.Inlines.Add(rn2);
            tb_Test.Inlines.Add(new LineBreak()); //LineBreak추가

            Run rn3 = new Run();
            rn3.Foreground = new SolidColorBrush(Colors.Black);
            rn3.FontSize = 15;
            rn3.Text = "Test";

            tb_Test.Inlines.Add(rn3);

            LayoutRoot.Children.Add(tb_Test);


by 피요히코~ 2009. 11. 30. 22:57
XAML
<Grid x:Name="MyGrid" Width="400" Height="400" ShowGridLines="True">
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
</Grid>

 

CS
Grid grid = new Grid();
grid.RowDefinitions.Add(new RowDefinition());
grid.RowDefinitions.Add(new RowDefinition());

grid.ColumnDefinitions.Add(new ColumnDefinition());
grid.ColumnDefinitions.Add(new ColumnDefinition());

grid.ShowGridLines = true;


by 피요히코~ 2009. 11. 24. 23:19

EX) 버튼에 margin을 준다면

XAML에서
<Button x:Name="btn_MyBtn" Width="100" Height="100" Margin="5,5,5,5"></Button>

 

CS에서
Thickness thickness = new Thickness();
thickness.Left = 5;
thickness.Top = 5;
thickness.Right = 5;
thickness.Bottom = 5;

btn_MyBtn.Margin = thickness;



XAML에서의 margin순서는
CS에서와 같이
좌 상 우 하
by 피요히코~ 2009. 11. 24. 22:59

MyRect.Fill = new SolidColorBrush(Colors.Blue);
by 피요히코~ 2009. 11. 24. 22:55
뭐. WPF에서도 될꺼 같긴 한데요. 일단 해본게 실버라이트니...

실버라이트는 파일이 두개로 나눠져 있죠.
(엄밀히 말하면 세개려나요..)
*.xaml
*.xaml.cs
*.g.cs <<- 요녀석은 프로젝트폴더의 obj폴더 안의 degug안에 뒤져보면 있어요.

실버라이트의 모든 페이지는 UserControl을 상속받잖아요.
근데 만약에
UserControl을 상속받은 다른 Class를 만든후에
그 Class를 상속받는 페이지를 만들고 싶을때!

단순하게
*.xaml.cs쪽에서 (만들어놓은 class명이 myUserControl 일경우
public partial class control1 : myUesrControl
이라고 하면 될듯 싶지만.
이게 잘 안되네요

왜냐.
이녀석들이 빌드되면서
xaml코드에 맞는 parial class를 자동생성해 주는데
(이놈이 *.g.cs)
여기는 상속받는 class가 UserControl로 되어있어요

partial class가 서로 상속받는 class가 다르니
꺼지라고 오류가 나옵니다.

이거때문에 한참 찾고 이거저거 해봤는데.
시베리아에서 답을 찾았네요. (찬용님 ㄳㄳ~~~)

방법은
하고나니 간단합니다. ㅠㅠㅋ

*.xaml코드를 보면. 시작태그가 있잖아요.
<Usercontrol x:Class="......
.........</Usercontrol>


이녀석을 바꿔주면 됩니다.
cs쪽에서 using하고 상속받고 하는거랑 비슷하네요

이름은 임의로 정할수 있어요
<tempControl:myUsercontrol 
 xmlns:tempControl="myUsercontrol의 네임스페이스"
 (나머지코드는 동일)........
......</tempControl:myUsercontrol>

이렇게 바꿔주면 되네요.

휴..
하고나니 이렇게 간단한걸. ㅠㅠ

by 피요히코~ 2009. 10. 14. 15:39
- 일단 좋은 정보를 가르쳐 주신 김효석과장님 감사합니다~ ㅋ

가끔 궁금했던것중 하나가.
스트링값을 가지고. 컨트롤을 찾는다던가.
클래스 인스턴스를 만들수 있느냐 였어요.

컨트롤 찾는건 어떻게어떻게 하는걸 알아냈는데
클래스 인스턴스 만드는건 모르겠더라구요.

그러다가 비슷한 고민을 하던 김과장님이 알려준방법!!

 Type targetPageType = Type.GetType(targetPageClass);
userForm = (UserControl)Activator.CreateInstance(targetPageType);

요건데요.
여기서 targetPageClass는 스트링으로 된 클래스 명이에요.
userForm은 UserControl 형식이구요
(silverlight 소스입니다)

클래스명은
factory.Forms.menu.TopMenu
이런식으로
네임스페이스 포함된 풀네임이 있으면 됩니다.

전 단지 이게 궁금했을 뿐인데
김과장님은 다른걸 하기 위해서 이게 필요해서 찾아내셨다고 하네요.
어쨌든
이걸 할수 있게 되니
이래저래 할수 있는게 많아지겠네요.
by 피요히코~ 2009. 10. 14. 10:18
| 1 2 3 4 5 |