c# - How to use Extend Custom Control and use in Window -
i want make window similar android screen shows state of bluetooth, wifi..etc. have class checks state of said device , returns byte value of 0 off, 1 on , 0xff error. made button (probably should togglebutton..but i'm new wpf)
public class toggletaskbutton : system.windows.controls.primitives.buttonbase { public imagesource imagesource { { return (imagesource)getvalue(imagesourceproperty); } set { setvalue(imagesourceproperty, value); } } public color mybackgroundcolor { { return (color)getvalue(mybackgroundcolorproperty); } set { setvalue(mybackgroundcolorproperty, value); } } // using dependencyproperty backing store mybackgroundcolor. enables animation, styling, binding, etc... public static readonly dependencyproperty mybackgroundcolorproperty = dependencyproperty.register("mybackgroundcolor", typeof(color), typeof(toggletaskbutton), new propertymetadata(null)); // using dependencyproperty backing store imagesource. enables animation, styling, binding, etc... public static readonly dependencyproperty imagesourceproperty = dependencyproperty.register("imagesource", typeof(imagesource), typeof(toggletaskbutton), new uipropertymetadata(null)); }
a note class above i'm thinking don't want dependency property?? instead rather set value , background color changes appropriate color. 0 gray, 1 green >1 red. 1 thing don't know how do
i made bluetooth usercontrol , changed type toggletaskbutton. project class library, don't resource dictionary :/ trying button click portion work correctly before posted this. sorry mess.
<ata:toggletaskbutton x:class="advancedtaskassigner.controls.bluetoothcontrol" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:ata="clr-namespace:advancedtaskassigner.controls" mc:ignorable="d" d:designheight="300" d:designwidth="300" loaded="usercontrol_loaded" click="toggletaskbutton_click" imagesource="/advancedtaskassigner;component/resources/bluetooth.png" mybackgroundcolor="green"> <ata:toggletaskbutton.resources> <style targettype="{x:type ata:toggletaskbutton}"> <setter property="template"> <setter.value> <controltemplate targettype="{x:type ata:toggletaskbutton}"> <viewbox> <grid> <border borderbrush="#ff58595b" borderthickness="15,15,15,15" cornerradius="8,8,8,8" > <border.background> <radialgradientbrush> <gradientstop color="#ffb2b2b2" offset=".75"/> <gradientstop offset="1" color="#ffb2b2b2" /> </radialgradientbrush> </border.background> <viewbox> <image margin="25" height="100" width="100" source="{templatebinding imagesource}" /> </viewbox> </border> </grid> </viewbox> </controltemplate> </setter.value> </setter> </style> </ata:toggletaskbutton.resources> </ata:toggletaskbutton>
code behind
using system.windows; using system.windows.controls; using system.windows.media; namespace advancedtaskassigner.controls { /// <summary> /// interaction logic bluetoothcontrol.xaml /// </summary> public partial class bluetoothcontrol : toggletaskbutton { public bluetoothcontrol() { initializecomponent(); task = new brightnesstask(); } private void usercontrol_loaded(object sender, routedeventargs e) { checkbluetoothstate(); system.console.beep(1000, 100); } private void checkbluetoothstate() { //bluetoothstate = ((byte)task.getstate() == 0x01); //color c = bluetoothstate ? (color)findresource("enabledcolor") : (color)findresource("disabledcolor"); //this.outsidecolor.color = c; } private brightnesstask task; private bool bluetoothstate = false; private void toggletaskbutton_click(object sender, routedeventargs e) { if (bluetoothstate) { task.performtaskdown(); messagebox.show("boo"); system.console.beep(1000, 100); } //if bluetooth enabled..disable else { task.performtaskup(); system.console.beep(2000, 100); messagebox.show("boo"); }//if bluetooth disabled..enable. checkbluetoothstate(); } } }
so end not know doing. want wpf because of wide array of tablets , various screen sizes i'm giong deal with. i'm thinking onload control should use bluetooth task set state. when state gets set changes color of second gradient stop on border background. please help. how set gradientstop's color? , when add control usercontrol in wpf application shows nothing, in designer shows 1 of these 3 buttons
i created example attached dependency property currentstatus
, contains current status of connection. created template button
triggers set properties button
, depending on state. @ button
can have 3 states, , add new state not difficult.
example of button style:
<style x:key="bluetoothbuttonstyle" targettype="{x:type button}"> <setter property="background" value="gainsboro" /> <setter property="foreground" value="black" /> <setter property="fontsize" value="15" /> <setter property="focusvisualstyle" value="{x:null}" /> <setter property="snapstodevicepixels" value="true" /> <setter property="template"> <setter.value> <controltemplate targettype="{x:type button}"> <border cornerradius="2" background="{templatebinding background}"> <grid> <contentpresenter x:name="mycontentpresenter" content="{templatebinding content}" horizontalalignment="center" verticalalignment="center" margin="0,0,0,0" /> <path x:name="bicon" width="15" height="27" stretch="fill" fill="#ff000000" data="f1 m 51,47l 36,61l 36,43l 28.25,50l 25.25,46.75l 35,38l 25.25,29.25l 28.25,26l 36,32l 36,14l 51,29l 42,38l 51,47 z m 41,43l 41,50.5l 44.5,46.5l 41,43 z m 41,33l 44.5,29.5l 41,25.3995l 41,33 z "/> </grid> </border> <controltemplate.triggers> <datatrigger binding="{binding relativesource={relativesource self}, path=(local:depclass.currentstatus)}" value="1"> <setter property="background" value="green" /> </datatrigger> <datatrigger binding="{binding relativesource={relativesource self}, path=(local:depclass.currentstatus)}" value="2"> <setter property="background" value="red" /> <setter property="foreground" value="white" /> </datatrigger> <trigger property="ismouseover" value="true"> <setter property="background" value="#e59400" /> <setter targetname="bicon" property="fill" value="white" /> </trigger> </controltemplate.triggers> </controltemplate> </setter.value> </setter> </style>
here datatrigger
sets value status:
<datatrigger binding="{binding relativesource={relativesource self}, path=(local:depclass.currentstatus)}" value="1"> <setter property="background" value="green" /> </datatrigger>
the trigger can this:
<trigger property="local:depclass.currentstatus" value="1"> <setter property="background" value="#e59400" /> </trigger>
this same.
output
status 0
:
status 1
:
status 2
:
listing of dependencyproperty
:
public class depclass : dependencyobject { public static readonly dependencyproperty currentstatusproperty; public static void setcurrentstatus(dependencyobject depobject, int value) { depobject.setvalue(currentstatusproperty, value); } public static int getcurrentstatus(dependencyobject depobject) { return (int)depobject.getvalue(currentstatusproperty); } static depclass() { propertymetadata mypropertymetadata = new propertymetadata(0); currentstatusproperty = dependencyproperty.registerattached("currentstatus", typeof(int), typeof(depclass), mypropertymetadata); } }
status defined way:
depclass.setcurrentstatus(bluetoothbutton, 1);
or in xaml this:
<button local:depclass.currentstatus="0" ... />
complete example:
xaml
<window x:class="bluetoothbuttonhelp.mainwindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:bluetoothbuttonhelp" title="mainwindow" height="350" width="525" windowstartuplocation="centerscreen"> <window.resources> <style x:key="bluetoothbuttonstyle" targettype="{x:type button}"> <setter property="background" value="gainsboro" /> <setter property="foreground" value="black" /> <setter property="fontsize" value="15" /> <setter property="focusvisualstyle" value="{x:null}" /> <setter property="snapstodevicepixels" value="true" /> <setter property="template"> <setter.value> <controltemplate targettype="{x:type button}"> <border cornerradius="2" background="{templatebinding background}"> <grid> <contentpresenter x:name="mycontentpresenter" content="{templatebinding content}" horizontalalignment="center" verticalalignment="center" margin="0,0,0,0" /> <path x:name="bicon" width="15" height="27" stretch="fill" fill="#ff000000" data="f1 m 51,47l 36,61l 36,43l 28.25,50l 25.25,46.75l 35,38l 25.25,29.25l 28.25,26l 36,32l 36,14l 51,29l 42,38l 51,47 z m 41,43l 41,50.5l 44.5,46.5l 41,43 z m 41,33l 44.5,29.5l 41,25.3995l 41,33 z "/> </grid> </border> <controltemplate.triggers> <datatrigger binding="{binding relativesource={relativesource self}, path=(local:depclass.currentstatus)}" value="1"> <setter property="background" value="green" /> </datatrigger> <datatrigger binding="{binding relativesource={relativesource self}, path=(local:depclass.currentstatus)}" value="2"> <setter property="background" value="red" /> <setter property="foreground" value="white" /> </datatrigger> <trigger property="ismouseover" value="true"> <setter property="background" value="#e59400" /> <setter targetname="bicon" property="fill" value="white" /> </trigger> </controltemplate.triggers> </controltemplate> </setter.value> </setter> </style> </window.resources> <grid> <button name="bluetoothbutton" style="{staticresource bluetoothbuttonstyle}" local:depclass.currentstatus="0" width="40" height="40" /> <button name="status1" content="status 1" width="100" height="30" horizontalalignment="left" click="status1_click" /> <button name="status2" content="status 2" width="100" height="30" horizontalalignment="right" click="status2_click" /> <button name="status0" content="status 0" width="100" height="30" verticalalignment="top" click="status0_click" /> </grid> </window>
code behind
public partial class mainwindow : window { public mainwindow() { initializecomponent(); } private void status1_click(object sender, routedeventargs e) { depclass.setcurrentstatus(bluetoothbutton, 1); } private void status2_click(object sender, routedeventargs e) { depclass.setcurrentstatus(bluetoothbutton, 2); } private void status0_click(object sender, routedeventargs e) { depclass.setcurrentstatus(bluetoothbutton, 0); } } public class depclass : dependencyobject { public static readonly dependencyproperty currentstatusproperty; public static void setcurrentstatus(dependencyobject depobject, int value) { depobject.setvalue(currentstatusproperty, value); } public static int getcurrentstatus(dependencyobject depobject) { return (int)depobject.getvalue(currentstatusproperty); } static depclass() { propertymetadata mypropertymetadata = new propertymetadata(0); currentstatusproperty = dependencyproperty.registerattached("currentstatus", typeof(int), typeof(depclass), mypropertymetadata); } }
Comments
Post a Comment