To use DsoFramer on 64-bit systems, copy “dsoframer.ocx” to
“C:\Windows\SysWOW64\” and run command
"C:\Windows\SysWOW64\regsvr32.exe "C:\Windows\SysWOW64\dsoframer.ocx""
DsoFramer on x64
Eylül 7, 2009 yazan: smartclientWPF Page
Nisan 20, 2009 yazan: smartclientBazen standart Windows uygulamaları (ToolBar, Menu, vb) yerine, Web tarzı, sayfa tabanlı uygulamalar tasarlamak daha anlamlı olmaktadır. WPF’in sağladığı sayfa tabanlı uygulama mimarisi, kompleks olmayan uygulamalar ve özellikle kolay dağıtılabilen uygulamalar (XBAP) geliştirilmek istendiğinde uygun bir tercihtir.
Sayfa tabanlı uygulama geliştirmek için Window yerine Page sınıfını kullanmak gerekir. Uygulamayı tasarlarken Page sınıfının “top level container” olduğunu görürsünüz.Ancak “runtime”da durum biraz farklıdır. “Runtime”da Page sınıfı aşağıdakilerden birinin içerisinde bulunabilir,
- NavigationWindow
- Bir Window içindeki Frame
- Bir Page içindeki Frame
- “Web Browser” içindeki Frame
“Designer”da “top level” kontrol olarak Page verdiğinizde WPF otomatik olarak bir NavigationWindow objesi oluşturur ve bu Page’i içerisine ekler. NavigationWindow Window sınıfını “inherit” eder.
Page sınıfı “ContentControl”den türememesine rağmen sadece bir adet content alabilir.
Sayfalar arasında ilerlemek için “HyperLink”ler kullanılabilir.
<TextBlock> 2. Sayfaya Git <Hyperlink NavigateUri="Sayfa2.xaml"> Git </Hyperlink> </TextBlock>
“NavigateUri” “property”sine bir web adresi yazarsanız, kliklendiğinde ilgili web sayfası görüntülenecektir.
Eğer “target page” “scrollable”sa, “ NavigateUri = "Sayfa.xaml#txtUserName" ” gibi bir ifade direkt olarak o “control”ü gösterecek şekilde sayfayı yükler.
“Page”leri “Frame” kontrolü içerisinde de yükleyebilirsiniz. Bu sayede bir “Window”un veya başka bir “Page”in içinde bir “Page” yükleyebilirsiniz.
WPF :: “Dependency Property” Depends
Nisan 8, 2009 yazan: smartclient“Dependency Property”lerin adında “dependency” geçmesinin nedeni “property” değerinin klasik .Net “property”leri gibi tek bir değişkene değil de bir çok değişkene ve mekanizmaya bağlı olmasındandır. Örneğin bir “dependency property”nin değerini okuduğunuzda “CoerceValueCallback” devreye girer. Bunun yanında bir “dependency property”nin değeri aşağıdaki sıraya göre belirlenir,
“FrameworkPropertyMetadata” ile atanmış “default” değer
“Inherited” değer. (Eğer “FrameworkPropertyMetadata.Inherits” “true” ise ve hiyerarşide üstteki elementlerden birinde bu “dependency property” “set” edilmişse)
“Theme style”dan gelen değer
“Project style”dan gelen değer
Koddan veya Xaml’dan atanmış lokal değer
Bu sayede bir çok “control” özelliklerini paylaşılmış “dependency property”lerden alırlar, bu da son derece performanslı ve az “memory” kullanan bir mekanizmadır.
WPF :: “Could not create an instance of type”
Nisan 6, 2009 yazan: smartclientTemelde hatanın nedeni, ilgili “UserControl”deki “Initialize” fonksiyonunda gerçekleşen adımlardan bazılarını “designer”ın çalıştıramaması. Aşağıdaki işlemleri yaparak hatanın nerden kaynaklandığını bulabilirsiniz.
- Problemli projeyi iki ayrı “VS”da açın. (VS1 ve VS2 diyelim)
- Her iki projede de bütün açık pencereleri (“source code” ve “designer”) kapatın.
- VS2′de hatalı “UserControl”ün “constructor”ına “break point” koyun.
- VS2′yi VS1′e “attach” edin.
- VS1′de hatalı “UserControl”ü içeren Xaml’i açın.
- VS2′deki “break point”de “step” ederek hatanın detayına ulaşabilirsiniz.
Wpf :: Dependency Propetry
Nisan 5, 2009 yazan: smartclient“Dependeny Property”ler (DP) entersan biçimde klasik .Net “property”lerinden tamamen farklı bir şekilde “implemente” edilmiştir. Temel neden ise daha performanslı olmaları ve gelişmiş mekanizmaları desteklemeleridir (“change notification”, “inheritance” gibi). DP’lerin “implementation”u farklı olsa bile onları aynı klasik .Net “property”lerini kullanır gibi kullanabiliriz.
Nedir
WPF’in özelliklerini (“data binding”, “style” gibi) kullanmak için geliştirilmiş yeni “property” “implementation”ıdır. Temel tasarım kriteri, klasik .Net “property”lerinin kullanım şekli işe DP’lerin kullanım şeklinin aynı olmasıdır. Bu tasarım gerçekleştirilirken klasik .Net “property”lerinin üzerinde çalışılmamış tamamen yeni bir mimari uygulanmıştır. Bunun temel nedeni ise performanstır. Eğer geliştiriciler DP’leri klasik .Net “property”leri üzerine inşa etmiş olsalardı, gerekli özellikleri sağlamak için çok fazla ekstra yük getiren kod parçacıkları yazmak zorunda kalacaklardı. Bunun yerine eski “property”ler gibi kullanılan tamamen yeni bir “property” geliştirdiler.
Nasıl Uygulanır
DP’nin “syntax”ına alışılması biraz zor olsa da uygulaması aslında son derece basittir. Öncelikle “propeerty”mizi temsilen bir “shared” nesneye ihtiyacımız var. Örnek olarak System.Windows.UIElement sınıfında tanımlı “visibility” “property”sine bakalım.
Public Class UIElement
Inherits Visual
Implements IAnimatable, IInputElementPublic
Shared ReadOnly VisibilityProperty As DependencyProperty
…
End Class
Genel kural olarak DP’nin adı klasik “property” adının sonuna “Property” kelimesi eklenmesiyle oluşturulur. Yukardaki kodda görüldüğü üzere “VisibilityProperty” adında, “shared” ve “readonly” (sadece “public constructor”da değer atanacak şekilde) olan bir DependencyProperty tipinde bir nesne tanımlanmıştır. Ancak bu “property”nin kullanılabilir olması için öncelikle WPF’e bu “property”yi kayıt etmektir. Herhangi bir kod parçacığı bu “property”ye ulaşmaya çalışmadan bu kayıt işleminin yapılması gerekmektedir. Bu nedenle aşağıdaki koddaki gibi ilgili sınıfın “static constructor”unda bu işlem yapılmıştır.
Shared Sub New()
Dim Mdata As New PropertyMetadata(VisibilityBoxes.VisibleBox, _
New PropertyChangedCallback(AddressOf UIElement.OnVisibilityChanged), _
New ValidateValueCallback(AddressOf UIElement.ValidateVisibility))
UIElement.VisibilityProperty = DependencyProperty.Register( _
“Visibility”, GetType(Visibility), GetType(UIElement), Mdata)
End Sub
DP kayıt işlemi iki adımdan oluşmaktadır. Bir, DP’nizle ilgili hangi servisleri kullanmak istediğinizi belirtiğiniz bir “FrameworkPropertyMetadata” oluşturulur. İki, “static” DependencyProperty.Register() metodunu kullanarak DP kayıt edilir. Bu aşamada sağlamanız gerekenler,
-
“Property” için bir isim (öneğimizde “Visibility”)
-
“Property”nin very tipi (örneğimizde “Visibility” “Enum”u)
-
“Property”yi barındıran nesnenin tipi (örneğimizde “UIElement”)
-
Opsiyonel, diğer özellikler için “FrameworkPropertyMetadata” objesi
-
Opsiyonel, “validation” için bir “callback”
“Property Validation”
Klasik .Net “property”lerinde “validation” “property”nin tanımının içerisinde yapılır. Ancak DP’ler için parametre olarak bir “object” alan ve “boolean” değer dönen bir “callback” tanımlanır. “Validation”da hata yoksa “true” varsa “false” dönülür. Aşağıdaki fonksiyon bu işi yapar.
Private Shared Function ValidateVisibility(ByVal o As Object) As Boolean
Dim visibility As Visibility = DirectCast(o, Visibility)
If ((visibility <> Visibility.Visible) AndAlso (visibility <> Visibility.Hidden)) Then
Return (visibility = Visibility.Collapsed)
End If
Return True
End Function
Bu “callback”lerle ilgili bir limitasyon, “static” olan “callback”in “validate” ettiği nesneye ulaşamamasıdır.
“Property Wrapper”
Oluşturulan DP’nin klasik .Net “property”leri gibi kullanılabilinmesi için DP’nin değerine ulaşılmayı sağlayan klasik “property” tanımı yapılması gerekir.
Public Property Visibility As Visibility
Get
ReturnGetValue(VisibilityProperty)
End Get
Set(ByVal value As Visibility)
SetValue(VisibilityProperty, value)
End Set
End Property
Dikkat edilmesi gereken bir nokta da, bu “property” tanımına hiç bir ekstra satır eklenmemelidir.