2020년 7월 20일 월요일

WPF - Tip


글자 깨질때

1
<Label FontSize="10" Content="대한민국" TextOptions.TextRenderingMode="Grayscale"/>
cs

: Display 하면 작은 글자에서 뭉개지지 않음, 대신 확대 시 뭉개짐.
: IDeal 은 디폴트값으로 벡터기반이라 확대축소에도 뭉개지지 않음. 단 너무 작아지면 뭉개짐.
: 말고도 여러 옵션이 있음.
: 텍스트 뭉개진다고 뭐라하면 여기 손대면 됨.

스크롤 너비

1
<FrameworkElement Grid.Column="4" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}"/>
cs

FrameworkElement 는 거의 모든 컨트롤의 조상임.


코드로 브러쉬 지정

1
2
var converter = new System.Windows.Media.BrushConverter();
txt.Foreground = (Brush)converter.ConvertFromString("#FFFFFF90");
cs


기본브라우저로 창 띄우기

1
2
3
4
5
6
RegistryKey rkey = Registry.ClassesRoot.OpenSubKey(@"http\shell\open\command");
string name = rkey.GetValue(null).ToString().ToLower().Replace("" + (char)34"");
if (!name.EndsWith("exe"))
    name = name.Substring(0, name.LastIndexOf(".exe"+ 4);
rkey.Close();
System.Diagnostics.Process.Start(name, @"https://stackoverflow.com");
cs


Timer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public Timer()
{
    InitializeComponent();
 
    DispatcherTimer tmr = new DispatcherTimer();
    tmr.Interval = TimeSpan.FromMilliseconds(10);
    tmr.Tick += Tmr_Tick;
    tmr.Start();
 
}
 
private void Tmr_Tick(object sender, EventArgs e)
{
    lblTime.Content = string.Format("{0:HH:mm:ss.fff}", DateTime.Now);
}
cs

Thread 안전을 보장하는 DispatchTimer 를 사용.
이것은 Main Thread 에서만 돌아감.

1
2
3
4
System.Timers.Timer tmr2 = new System.Timers.Timer();
tmr2.Interval = 1000;
tmr2.Elapsed += Tmr2_Elapsed;
tmr2.Start();
cs

SubThread 는 Timer 를 사용함.
나아가서 MainThread 에서만 접근할 수 있는 컨트롤엔 적용할 수 없음.

1
2
3
4
5
6
7
8
9
10
11
public string strTm
{
    get { return _strTm; }
    set
    {
        lock(_strTm)
        {
            _strTm = value;
        }
    }
}
cs

위 두가지 Timer 를 이용해서 스레드의 역할분배를 할 수 있음.
예를들어 작업은 Timer 에서 하고 처리한 값을 메모리에 저장해서 DispatchTimer에서 화면에 처리된 값을 보여주는 작업을 하는 것임.
이때 Lock 을 꼭 걸어줘야함.

WebBrowser

1
2
3
4
5
6
7
<WebBrowser x:Name="wb"/>
 
<WindowsFormsHost>
    <WindowsFormsHost.Child>
        <wf:WebBrowser x:Name="wb_wf" DocumentTitleChanged ="wb_wf_DocumentTitleChanged"/>
    </WindowsFormsHost.Child>
</WindowsFormsHost>
cs

1
2
3
4
this.Title = (sender as System.Windows.Forms.WebBrowser).DocumentTitle; // 브라우저 타이틀 따기
 
wb.Navigate("http://www.naver.com");   // .net 내부에 있는 걸 쓰므로 웹브라우저 없어도 됨
wb_wf.Navigate("http://www.naver.com");   // .net 내부에 있는 걸 쓰므로 웹브라우저 없어도 됨
cs

HTML 문서 Title 따기
+ 브라우저 이동하기

내부 브라우저를 사용한다고 들었는데 확실하겐 모름.


Xaml 내 이동

1
2
3
<Label>
    <Hyperlink NavigateUri="/MyInput.xaml">link</Hyperlink>
</Label>
cs

1
2
frame.NavigationService.Navigate(new Uri("/MyInput.xaml", UriKind.Relative));
//Frame 은 Frame Control 
cs

SystemColor

1
grd.Background = SystemColors.ControlBrush;
cs


FlowDocument

1
2
3
4
5
6
<FlowDocumentPageViewer>
    <FlowDocument>
        <Paragraph FontSize="30">sfddfsdfsdafsdafdsafsdaf</Paragraph>
        <Paragraph FontStyle="14">sadfdfasafsadfsdafsdafsdfsd</Paragraph>
    </FlowDocument>
</FlowDocumentPageViewer>
cs

강력한 기능. 
비슷한 뷰어 종류가 몇개 있어서 필요한 기능을 위주로 사용하면 됨..


1
2
3
4
5
6
7
FlowDocument flow = new FlowDocument();
 
Paragraph pTitle = new Paragraph(new Run("예시 문단이 들어갈 자리"));
pTitle.FontSize = 30;
flow.Blocks.Add(pTitle);
 
flowDoc.Document = flow;
cs

코딩으로도 가능함


Disigner Unsafe Mode 에서 작동안되는 부분 있음.

특히 ObjectDataProvider 에서 얻은 데이터가 적용 안됨.


자식 윈도우 찾기

1
TextBox box = VisualTreeHelper.GetChild(_current_panel, 1) as TextBox;









댓글 없음:

댓글 쓰기

List